有什么方法可以使用反射来确定静态最终字段是否具有“=”值(以便该值在访问时内联)或者它的值是否由静态初始值设定项分配? 如果该字段确实有一个值,是否有任何方法可以在不使用 Field.get 方法的情况下检索该值(从而导致执行静态初始化程序)?
最佳答案
只有当它是一个编译时常量时,该字段才会被“内联”——参见 JLS 中的冗长定义。 .
所以仅仅在声明的时候赋值是不够的。 这不是编译时常量,尽管是一个有效的声明:
static final int INT_CONST = compute();
static int compute() {
return 5;
}
仅通过反射您无法确定该字段是如何初始化的。
要访问类字段的任何值,需要首先加载该类,因此您无法阻止静态初始化程序的运行。
关于java - 使用反射,我可以确定 Java static final 字段是否将被内联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32499354/