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