当前位置: 首页 > 知识库问答 >
问题:

使用反射使用子类获取超类字段

柴俊捷
2023-03-14

基本上,我的要求是通过使用反射来获取超类对象,以便获得字段名及其值。

所以,我有一门课

Class Emp {
  private firstName;
  priavte lastName;
}

Class Dept extend Emp {
  private dpFirstName;
  priavte dpLastName;
}

现在我正在使用

emp.getClass.getSuperClass

当我尝试使用以下代码访问该字段时,它会给我java.lang.Class类的类型。

Class<?> fields = emp.getClass.getSuperClass;
for (Field field : fields.getDeclaredFields()) {
  field.setAccessible(true);             
  System.out.println(field.get(emp.getClass.getSuperClass));
}

它让我异常

Can not set java.lang.String field com.Dept.dpFirstName to java.lang.Class

有人能帮助我如何将其转换为对象,以便我可以访问文件夹

共有3个答案

仇正豪
2023-03-14

假设代码的有效版本如下所示:

class Emp {
    private String firstName;
    private String lastName;
}

class Dept extends Emp {
    private String dpFirstName;
    private String dpLastName;
}

编辑:福吉关于演员阵容,没有它也能工作。

Class<?> fields = emp.getClass().getSuperclass();

for (Field field : fields.getDeclaredFields()) {
  field.setAccessible(true);             
  System.out.println(field.getName() + "\t" + field.get(emp));
}
支劲
2023-03-14

您的问题是您获得了Emp的超类,但没有部门

Emp emp = new Emp();
Dept dept = new Dept();

Class<?> cls = emp.getClass().getSuperclass(); // it is Class<Object>
Class<?> cls = dept.getClass().getSuperclass(); // it is Class<Emp>

因此,您可以使用以下代码段作为正确的示例:

class Emp {
    private String firstName = "first_name";
    private String lastName = "last_name";
}

class Dept extends Emp {
    private String dpFirstName = "dp_first_name";
    private String dpLastName = "dp_last_name";
}

public static void getSuperClassFields(Dept dept) throws IllegalAccessException {
    Class<?> cls = dept.getClass().getSuperclass();

    for (Field field : cls.getDeclaredFields()) {
        field.setAccessible(true);
        System.out.println(field.getName() + " = " + field.get(dept));
    }
}

public static void main(String[] args) throws IllegalAccessException {
    getSuperClassFields(new Dept());
    // in console you can see
    // firstName = first_name
    // lastName = last_name
}
郑卜鹰
2023-03-14
public class Emp {

    private String firstName;
    private String lastName;
}

public class Dep extends Emp{

    private String dpFirstName;
    private String dpLastName;
}

public class Main {

    public static void main(String[] args) throws Exception {
        Dep d = new Dep();

        Class<?> c = d.getClass().getSuperclass();

        for (Field field : c.getDeclaredFields()) {
            field.setAccessible(true);
            if(field.getName().equals("firstName")){
                field.set(d, "First Name");
            }
            if(field.getName().equals("lastName")){
                field.set(d, "Last Name");
            }
            System.out.println(field.getName() + "\t" + field.get(d));

        }

    }
}
 类似资料:
  • 下面是我的示例类,我希望通过在这行中使用反射来获取y和z字段(Field[]fields=forName.getDeclaredFields();)我得到了空数组。如果y和z不是类结构的一部分,那么它们属于哪一部分

  • 问题内容: 我无法获取字段值。我想做的是在运行时获取对象。请让我知道我要去哪里了。 测试类 } EX.class } 问题答案: 像这样 或者,您可以使用类的方法在运行时获取对象的实例。您仍然需要首先设置该实例变量,否则它将没有任何值。 例如 或者,在其构造函数中有两个参数的地方,例如String和int … 或者您可以在运行时使用它为其构造函数查询 注意:我特意省略了将在此创建的对象强制转换为预

  • 如果调用,将得到一个空列表。 我尝试在Java中,在Kotlin中使用kotlin-reflect库,但没有成功。 我还尝试了https://github.com/ronmamo/reflections库进行反射,我得到了同样的结果。 你知道如何访问那个私有字段或者如何使用反射扩展一个隐藏的抽象类吗?

  • 问题内容: 我有两节课: 我有一个实例B。如何调用A.method()从b?基本上,效果与super.method()从调用相同B。 但是上述代码仍会调用。 问题答案: 如果使用的是JDK7,则可以使用MethodHandle实现此目的:

  • 问题内容: 是否可以获取通用参数的类型? 一个例子: 问题答案: 我曾经偶然发现的一种结构看起来像 因此,似乎有些不可思议的想法使我感到遗憾,我很不了解…对不起。

  • 问题内容: 我正在尝试使用反射来获取在类中显式声明的所有公共方法(因此将无法工作,因为它也可以获取超类方法)。我可以用 只能从该类中获取方法,但是我只想使用公共方法。 在这一点上,我试图抓住修饰符并据此执行某些操作,但是由于某些原因,调试器中显示的修饰符值与修饰符值输出不同。例如,我有一个私有方法,尽管“ modifiers”值在调试器中显示,但在输出时却显示。奇怪的。还有另一种获取公共方法的方法