Object
のメソッド宣言が見つかったクラスのソースコードを確認しましgetClass()
た
public final native Class<?> getClass();
そしての宣言hashCode()
は
public native int hashCode();
これら 2 つのメソッドnative
がクラスにあるのはなぜですか? また、これらのメソッドのソース コードを取得するにはどうすればよいですか?
ここでネイティブ メソッドの完全なソース コードを見つけることができます。
これがうまくいくことを願っています。
マシンと対話する必要があるため、これらはネイティブ メソッドです。ここでは、マシン依存コードが C 言語で記述されています。これは、ソース パッケージやJava ランタイム環境(JRE)rt.jar
のlib
場所には含まれていません。
ネイティブであるもう 1 つの理由は、おそらくパフォーマンス上の理由です。C レベルのプログラミングにより、パフォーマンスが向上する可能性があるため、C 言語でネイティブ コードを記述した可能性があります。
メソッドはネイティブ データに関係するため、ネイティブです。このhashCode
メソッドは、ヒープ上のオブジェクトへのポインターの内部表現に応じて整数値を返します。メソッドは、コンパイルされたプログラムのクラス階層を表すgetClass
内部vtbl
(仮想関数テーブル) にアクセスする必要があります。コア Java では、これらのいずれも可能ではありません。
Object クラスのソース コードは、ここにあります。
このソースには 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 implementationもお読みください。詳細を示します。しかし、hashCode がオブジェクトの ID から生成されたものではないという誤った主張をしています。
それが役に立てば幸い。
これらの情報は、ヘッダー (クラスの場合) または他の場所 (hashCode の場合) にあります。これは、Java で実装できるものではありません。これらのメソッドのソースは、JVM のソースにあります。たとえば、OpenJDK のソースをダウンロードできます。