java - 在 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 的评论),因为两个版本都会产生完全相同的字节码。
解决方案
推荐阅读
- javascript - 有没有办法用 node.js 检查电子邮件域的有效性例如,gmail.com 是有效的形式,如果用户输入 egmail.com 或类似的东西,
- mysql - 使用选择的结果作为视图中的字段名称
- mysql - 从大 MySQL 表中的所有列单元格中删除一个字符串
- json - 如何在 daml 中创建动态映射(键/值)对?
- java - 如何使用java流从列表中获取前5个最大值
- transformation - Kentico 11:在 text/xml 转换中使用变量
- docker-compose - 超级账本结构:docker-compose orderer 出口 2
- paperjs - 将点添加到 Path.Circle 第一个点是 0,0?
- linux - 如何使用 systemd 和 aplay 播放启动声音?
- python - np.isin() 忽略数组的一些条目