首页 > 解决方案 > 在 Java 上,使用反射,如何判断字段的值是在声明中设置还是在构造函数主体中设置

问题描述

我试图判断 Java 类中的字段值是在声明中设置还是在构造函数主体中设置。

考虑Case Declaration的以下代码:

class MyClass {
    int myField = 42;   // myField is initialized on declaration
    MyClass() {
        // this constructor is **not** setting myField
    }
}

案例构造函数

class MyClass {
    int myField;      // myField is initialized on declaration with base value (0)
    MyClass() {
        myField = 42; // myField gets value on constructor
    }
}

改写我的问题:通过使用反射,我可以判断我是在Case Declaration还是在Case Constructor,如果是,如何?

我得到的最接近的是从实例中获取字段值(例如在这个问题上)但这需要实例化,所以我最终在这两种情况下都得到了值 42 。

代码可能类似于:

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Field field = MyClass.class.getDeclaredField("myField");
    MyClass instance = new MyClass();
    System.out.println("myField: " + field.get(instance));  // it writes 42 in both cases
}

我可以解析这两个类的源代码,但这需要向我宁愿避免的工作流程添加一些复杂性。

如果您需要一些上下文,我正在教授一门关于使用 Java 的 OOP 的入门课程,并且我为我的学生提供了一些 JUnit 代码来检查他们的解决方案是否满足要求。在这个具体的案例中,我试图强迫他们第一次开始使用构造函数的初始化。

回答:在运行时无法判断(请参阅@Sweeper 的评论),因为两个版本都会产生完全相同的字节码

标签: javareflection

解决方案


推荐阅读