2013-05-22 10 views
7

私はjavapを持つクラスを逆コンパイルしていると私はこのように、定数プールのセクションで、いくつかの重複を見ている:Javaクラスの定数プールは重複していますか?

#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に従って正しいですか?私はすべてのクラスが一度だけ言及され、後でそのバイトコード部分のインデックスで参照されると考えました。

$ javac -version 
javac 1.7.0_15 

他の奇妙なことは、javacのPool.javaで定数プールを表すクラスのソースです。これは、オブジェクトがすでに存在する場合(HashMapの助けを借りて)オブジェクトをプールに入れないことを示します。私はこれらのクラスのequals()/ hashCode()メソッドが正しく実装されているのだろうかと思います。

答えて

1

あなたは正しいです。 Constant poolは、の重複エントリを必要としません。 1つのクラスは、定数プールに1つのエントリしか持たないようにしてください。

これは間違いなくバグです。これをチェックしてください。誰かがこれをバグとして記録されており、それが認識されている>>http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6746955

更新回答:私はここで指摘したい

もう一つは、それが増加するため、重複したエントリを追加すると、任意の意味をなさないということですJavaクラスファイルのコンパクトさ、移植性、およびより高速なネットワークモビリティの主な目的を破壊します。クラスファイルは可能な限りコンパクトでなければなりません。

ところで、クラスファイルは定義されたクラスファイルフォーマットに準拠しているため、有効です。しかし、それは理想的なものではありません。

私がするのを忘れているように、2つ目の質問に答える

JVMは似て探してが同じハッシュコードをオブジェクトが、それでも彼らは別個のものになるが割り当てられます。両方とも同じオブジェクトを参照していない限り、JVMは2つのオブジェクトを全く作成しません。 Hashcodeはパーティションシステムに過ぎません。同様の見え方のオブジェクトは同じパーティションに配置され、特定のオブジェクトを検索しながら移動時間が少なくなります。 Hashcodeはその小さなパーティションへのポインタにすぎません。

新しいオブジェクトに異なるハッシュコードを割り当てることはできないため(オブジェクトの数が可能なユニークなハッシュコードの数よりも多くなる可能性があるので、ハッシュアルゴリズムの可能な衝突を参照してください)、異なるハッシュコード。しかし、ここには、メモリ内の同じ参照を指す2つのオブジェクトが同じハッシュコードを持つ必要があります。

したがって、、ストーリーのモラル、JVMは、ハッシュコードが同じでも2つの異なるオブジェクトが決して同一ではないことを確認します。

+0

で観察し、その内部クラスをロードすることは技術的に法的拒否されますされている間、あなたはその時に見ていましたように見えますバグをリンクしましたか?それは2008年に報告され、最後の活動は2年前です。それは実際に壊れていた、それはずっと前に修正されていただろう。 – cHao

+0

私はそれが何歳だったかを言及していませんでした。私はそのバグとその謝辞に言及していました。私はこれが本当にバグだと言っていた。 –

+0

これは非効率です....しかし間違っているわけではありません。 – cHao

3

私がJVM仕様から理解しているように、定数プールの重複エントリを防ぐような制限はありません。 一般に、クラスファイルを生成するコンパイラには重複がありません。しかし、クラスファイルに重複があっても、期待される動作には影響しません。

逆コンパイルしたクラスファイルはどのように作成されましたか?

0

注:JENKINS-22525によると、そのような重複を持つクラスファイルは、IBMのJ9 VMは、いくつかのケースで

java.lang.IncompatibleClassChangeError: incompatible InnerClasses attribute between … 
関連する問題