如何获取扩展类的非静态字段?
我知道如何获取静态字段,但不知道如何从实例获取字段。
<小时/>我已经尝试过
Field commandName = command.getField("name");
但我收到 NoSuchFieldException
异常。
这些是类:
public class A extends B{
public A(String name){
super(name);
}
}
public class B{
private String name;
protected B(String name){
this.name = name;
}
}
我需要从外部类获取名称。
最佳答案
有一个类,Test
,例如:
public class Test {
public int field1;
}
还有一个子类,SubTest
,例如:
//This class extends Test
public class SubTest extends Test {
public SubTest(int value) {
field1 = value;//field1 is public, so we can access it from subclass.
}
}
我们可以使用 Field
执行以下操作对象:
public static void main(String[] args)
throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
SubTest t0 = new SubTest(-10), t1 = new SubTest(0), t2 = new SubTest(10);
Field f = SubTest.class.getField("field1");
System.out.println(f.get(t0));
System.out.println(f.get(t1));
System.out.println(f.get(t2));
}
打印:
-10
0
10
说明:Field
Java中的类可以从Class
获取对象(不是类的实例),可用于操作/读取它代表对象的实际字段。在此示例中,我们得到 Field
代表 field1
的类然后我们用它来从每个 SubTest
中获取实际字段的值我们创建了。
请注意main方法抛出的异常。 Java 反射有时会抛出许多已检查的异常。
如果您的父类(super class) ( Test
) 中的字段是 private
,您需要获取您的类的父类(super class)(即 SubTest
的父类(super class)),然后从中获取 declared 字段。请参阅this link正如 Zabuza 指出的更多信息。
关于java - 通过反射获取非静态继承字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46612782/