【发布时间】:2013-05-17 05:50:11
【问题描述】:
我用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;
根据The class File Format,这个类是否正确?我认为每个 Class 只被提及一次,稍后由它在字节码部分的索引来引用。
$ javac -version
javac 1.7.0_15
另一个奇怪的事情是在 javac Pool.java 中表示常量池的类的源代码中。这表明如果对象已经存在(在 HashMap 的帮助下),它将不会将对象放入池中。我想知道这些类的equals()/hashCode()方法是否正确实现。
【问题讨论】: