我将项目的编译从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文件相同。