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

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

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

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

对于类级别的依赖性分析,这里有透明度会很棒!注意我不是要求在依赖代码中以某种方式显示任何更改的值(请参阅其他SO问题的负载)…

我正在考虑使用javac的Java Compiler API插件,但这听起来有点牵强吗?有任何想法吗?

最佳答案 只有
final variables initialized to constant expressions可以如此内联.因此,如果你想避免像这样的编译时间内联,那么显而易见的方法是使字段非final或使初始化表达式足够复杂以至于它不再被认为是常量(例如(null == null)?1234:0 ))
 ¹.

一旦你已经运行了编译器,它就太晚了,因为生成的代码与你插入常量内联而不是引用字段完全相同.

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

点赞