39

Objectのメソッド宣言が見つかったクラスのソースコードを確認しましgetClass()

public final native Class<?> getClass();

そしての宣言hashCode()

public native int hashCode();

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

4

3 に答える 3

50

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

これがうまくいくことを願っています。

マシンと対話する必要があるため、これらはネイティブ メソッドです。ここでは、マシン依存コードが C 言語で記述されています。これは、ソース パッケージやJava ランタイム環境(JRE)rt.jarlib場所には含まれていません。

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

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

于 2012-05-14T09:07:28.033 に答える
38

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 から生成されたものではないという誤った主張をしています。

それが役に立てば幸い。

于 2012-05-14T08:18:33.917 に答える
2

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

于 2012-05-14T07:09:24.230 に答える