web-dev-qa-db-ja.com

hashCode()およびgetClass()がネイティブメソッドであるのはなぜですか?

Objectクラスのソースコードを調べたところ、getClass()のメソッド宣言が

_public final native Class<?> getClass();
_

そして、hashCode()の宣言は

_public native int hashCode();
_

これらの2つのメソッドがクラス内のnativeメソッドであるのはなぜですか。また、これらのメソッドのソースコードを取得するにはどうすればよいですか。

37
user1391940

ネイティブメソッドの完全なソースコードを見つけることができます here

これがあなたのために働くことを願っています。

マシンと対話する必要があるため、これらはネイティブメソッドです。ここでは、マシンに依存するコードはC言語で記述されていますが、これはソースパッケージに含まれていないか、librt.jarの-​​ Java Runtime Environment (JRE)の場所にあります。 。

ネイティブになるもう1つの理由は、おそらくパフォーマンス上の理由です。 Cレベルのため、プログラミングのパフォーマンスが向上する可能性があるため、C言語でネイティブコードを記述した可能性があります。

メソッドはネイティブデータに関係するため、ネイティブです。 hashCodeメソッドは、ヒープ上のオブジェクトへのポインターの内部表現に依存する整数値を返します。 getClassメソッドは、コンパイルされたプログラムのクラス階層を表す内部vtbl仮想関数テーブル )にアクセスする必要があります。これらのどちらもコアJavaでは不可能です。

45
Bhavik Ambani

Objectクラスのソースコードは以下にあります here

このソースには、getClass()メソッドの実装が含まれています(58行目を参照)。 hashCodeは、関数ポインターJVM_IHashCodeとして定義されています(43行目を参照)。

JVM_IHashCodeは jvm.cpp で定義されています。 504行目から始まるコードを参照してください。これにより、 synchronizer.cpp で定義されているObjectSynchronizer :: FastHashCodeが呼び出されます。 576行目のFastHashCodeと530行目のget_next_hashの実装を参照してください。

おそらく、メソッドはパフォーマンスにとってネイティブであり、実装の実際的な問題のためです。

たとえば、javadocsから、hashCodeは通常、「オブジェクトの内部アドレスを整数に変換することによって」実装されます。この内部アドレスはJava sdkを介して利用できないため、ネイティブメソッドとして実装する必要があります。

読んでください Javaネイティブメソッドのソースを見つけることは可能ですか? 。このブログ投稿も読んでください Object.hashCode実装 。それ詳細を示しますが、hashCodeがオブジェクトのIDから生成されていないという誤った主張をします。

それが役に立てば幸い。

37
krishnakumarp

これらの情報は、ヘッダー(クラスの場合)または他の場所(hashCodeの場合)にあります。これは、Javaで実装できるものではありません。これらのメソッドのソースは、JVMのソースにあります。例えばOpenJDKのソースをダウンロードできます。

2
Peter Lawrey