我已经反编译了一个类,javap
并且在常量池部分看到了一些重复项,如下所示:
#19 = Class #350 // java/lang/StringBuilder
... Some other class constants here
#318 = Class #350 // java/lang/StringBuilder
Methodrefs 仅引用其中之一:
#20 = Methodref #19.#351 // java/lang/StringBuilder."<init>":()V
#22 = Methodref #19.#353 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#24 = Methodref #19.#355 // java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
#25 = Methodref #19.#356 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#110 = Methodref #19.#445 // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
根据类文件格式,这个类是否正确?我认为每个 Class 只被提及一次,稍后通过它在字节码部分的索引来引用。
$ javac -version
javac 1.7.0_15
另一个奇怪的事情是在 javac Pool.java中代表常量池的类的源代码中。这表明如果对象已经存在(在 HashMap 的帮助下),它将不会将对象放入池中。我想知道这些类的 equals()/hashCode() 方法是否正确实现。