java - 通过反射获取非静态继承字段

标签 java reflection

如何获取扩展类的非静态字段

我知道如何获取静态字段,但不知道如何从实例获取字段

<小时/>

我已经尝试过

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/

相关文章:

java - ProblemFact 中具有 InverseRelationShadowVariable 的 PlanningEntity 字段未更新 - Optaplanner

java - 在 Java 中调用方法之前和之后运行方法

java - 如何高效地为 MT20x 消息制作 Wrapper

java - 有损压缩中的隐写术 (JAVA)

java - RecyclerView 没有更新 OnPostExecute() 上的项目

java - JSpinner 获取空值

c# - 如何测试一个类型是否是匿名的?

C# - 获取对对象的引用数

c# - 在没有调试器的情况下运行测试时,Visual Studio 单元测试失败

c# - 无法在运行时从程序集中获取方法