将Ant更改为Maven后,#值中的字节码差异



我将项目的编译从Ant更改为Maven。我们仍然使用Java 1.7.0_80。除了Comparator类之外,所有类的ByteCode都保持不变。我用javap -c分解了这个类。唯一的区别是#-值,例如:

之前:invokevirtual #2

之后:invokevirtual #29

这些#-values是什么意思?这是功能上的差异,还是只是命名上的差异?

EDIT:字节码前后的第一个方法:

public de.continentale.kvrl.model.comp.KvRLRechBetragEuroComparator();
Code:
0: aload_0       
1: invokespecial #1                  // Method java/lang/Object."<init>":()V
4: return        

public de.continentale.kvrl.model.comp.KvRLRechBetragEuroComparator();
Code:
0: aload_0       
1: invokespecial #21                 // Method java/lang/Object."<init>":()V
4: return   

#29引用常量表中的一个索引,该索引描述了被调用的方法。如果粘贴javap -c完整输出,效果会更好,因为行末尾的注释指示实际的方法描述符。

javap -c在调用类Z:中的实例方法test时的示例

7: invokevirtual #19                 // Method snippet/Z.test:()V

只要注释中的方法描述符相同,就可以忽略#数字。

为什么

至于"为什么"的问题,很可能是由ant和maven编译器任务/插件设置中的调试引起的。

默认情况下,maven编译器插件在debug配置选项设置为true的情况下进行编译,该选项将附加源文件的名称,以及行号表和局部变量名等内容。

https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html

默认情况下,ant java编译器将此设置为false

https://ant.apache.org/manual/Tasks/javac.html

要进行比较和检查,请将Ant Javac任务的debug参数设置为true,看看这是否会使生成的.class文件相同。

相关内容

  • 没有找到相关文章

最新更新