使 Java 编译器在 class 文件中包含符号常量字段引用 - 可能吗?

Make Java compiler include symbolic constant field reference in class file - possible?

众所周知,Java 编译器在编译时 从其他 classes 中提取常量字段值。生成的 class 文件 包含此类常量的常量池条目(任何类型)。

问:可以告诉编译器这样做吗? (Oracle JDK 7 会更好)

作为说明,考虑一段代码 out.println(some.other.class.FOO) 读取 FOO(例如,public static final int FOO = 1234)并输出它。我能够找到对 println 的引用没问题,但是常量变成了匿名 sipush 1234.

对于class级别的依赖分析,这里要是透明就好了!请注意,我并没有要求在相关代码中以某种方式出现任何更改的值(请参阅有关其他SO问题的负载)...

我正在考虑 javac 的 Java 编译器 API 插件,但这听起来有点牵强?有什么想法吗?

final variables initialized to constant expressions can be so inlined. So if you want to avoid compile time inlining like that, the obvious approach is to either make the field non-final or make the initializing expression complicated enough that it is no longer considered constant (e.g. (null == null) ? 1234 : 0)) ¹.

一旦您已经 运行 编译器就为时已晚,因为生成的代码与插入常量内联而不是引用字段完全等效。

如果您正在对源代码进行静态分析,显然您可以使用任何标准的依赖项查找工具。