众所周知,Java编译器在编译时从其他类中提取常量字段值。由此产生的类文件不包含任何类型的常量池条目。
问:能否告诉编译器仅执行此操作?(Oracle JDK 7会很好)
作为示例,请考虑以下代码段out.println(some.other.class.FOO),它读取FOO(例如public static final int FOO = 1234)并输出它。我能够轻松找到对println的引用,但常量被转换为匿名sipush 1234。
对于类级别的依赖关系分析,这里透明度将非常重要!请注意,我不是要求在相关代码中以某种方式显示更改值(请参见其他SO问题的大量内容)...
我正在考虑一个Java编译器API插件来使用javac,但这听起来有点牵强附会?有什么想法吗?
问:能否告诉编译器仅执行此操作?(Oracle JDK 7会很好)
作为示例,请考虑以下代码段out.println(some.other.class.FOO),它读取FOO(例如public static final int FOO = 1234)并输出它。我能够轻松找到对println的引用,但常量被转换为匿名sipush 1234。
对于类级别的依赖关系分析,这里透明度将非常重要!请注意,我不是要求在相关代码中以某种方式显示更改值(请参见其他SO问题的大量内容)...
我正在考虑一个Java编译器API插件来使用javac,但这听起来有点牵强附会?有什么想法吗?
.obj
文件(Java.class
)被链接到可执行文件(Java .jar),最终产品不再使用.obj
文件。在Java中,.class
已经提交给了最终的优化过程。在Java中,使用源代码解析、AST(抽象语法树)更有意义,可以参考ASM和其他工具。 - Joop Eggen