4

众所周知,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 插件,但这听起来有点牵强?有任何想法吗?

4

1 回答 1

2

只有final初始化为常量表达式的变量才能如此内联。因此,如果您想避免像这样的编译时内联,显而易见的方法是使该字段为非final或使初始化表达式足够复杂以至于不再将其视为常量(例如(null == null) ? 1234 : 0) ¹

一旦你已经运行了编译器就太晚了,因为生成的代码完全等同于如果你插入了常量内联而不是引用一个字段。

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

于 2015-03-03T04:12:52.290 回答