众所周知,Java编译器在编译时从其他类中提取常量字段值。生成的类文件不包含此类常量的常量池条目(任何类型)。
Q: 能告诉编译器这样做吗?(Oracle JDK 7会很好)
如图所示,考虑一段代码读取FOO(比如public static final int FOO = 1234
)并输出它的out.println(some.other.class.FOO)
。我可以找到对println
的引用,这没有问题,但常量变成了匿名的sipush 1234
。
对于类级别的依赖性分析,如果这里有透明度就太好了!注意,我并没有要求在依赖代码中以某种方式出现的任何更改值(请参阅其他SO问题)。。。
我正在考虑为javac提供一个Java编译器API插件,但这听起来有点牵强?有什么想法吗?
只有初始化为常量表达式的final
变量才能如此内联。因此,如果您想避免像那样的编译时内联,显而易见的方法是要么使字段成为非final
,要么使初始化表达式变得足够复杂,使其不再被视为常量(例如(null == null) ? 1234 : 0)
)。
一旦你已经运行了编译器,就太晚了,因为生成的代码完全等同于你插入了内联常量而不是引用字段。
如果您正在对源代码进行静态分析,那么显然可以只使用任何标准的依赖项查找工具。