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



众所周知,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))。

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

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

相关内容

  • 没有找到相关文章

最新更新