2012-05-14 6 views
31

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

public final native Class<?> getClass(); 

し、これらの2つの方法クラスのnative方法がある理由hashCode()の宣言は

public native int hashCode(); 

がわかったObjectクラスのソースコードをチェックしそれらのメソッドのソースコードを入手するにはどうすればよいですか?

+13

重複していない - OPは、ネイティブが何であるかを知っていますが、これらの2つの方法は特にわかります。 – Alnitak

+5

hashCode()は、データが格納される方法が不当なオペレーティングシステムで異なる可能性があるため、ネイティブです。私はgetClass()がなぜだと分かりません。おそらく多型の実装が異なるためです。 – Vulcan

+1

@Vulcan getClass()はfinalなので、それをオーバーライドして型システムを破壊することはできません。 – EJP

答えて

35

あなたは、私はこれがあなたのために働くことを願っていますネイティブメソッドhere

の完全なソースコードを見つけることができます。

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

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

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

+1

'hashCodeメソッドは、ヒープ上のオブジェクトへのポインタの内部表現に依存する整数値を返します。'これは、[source](http://hg.openjdk。 java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp#l555)。 –

+0

@BrianAgnewねえ、兄さん、コードを更新しました –

2

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

29

ソースコードは(行58を参照)。このソースははgetClass()メソッドの実装を含むhere

を見つけることができます。 hashCodeは、関数ポインタJVM_IHashCode(43行目を参照)として定義されています。

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

おそらく、このメソッドはパフォーマンスのためにネイティブであり、実用的な問題が実装されているためです。

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

Is it possible to find the source for a Java native method?をお読みください。また、このブログ記事Object.hashCode implementationを読んでください。それはより詳細を与える。しかし、オブジェクトのアイデンティティからhashCodeが生成されないという誤ったアサーションがあります。

希望します。

+0

そして、JVMはプラットフォームに依存しないとはどういうことが言えますか? –

+0

これはどのようにプラットフォームの独立性を破るでしょうか?どのオブジェクトでも、hashCodeはプラットフォーム間で同じである必要はありません。その点については、同じプラットフォームであっても、異なるランで同じことさえありません。パブリッククラスTestHashCode { public static void main(String [] args){ オブジェクトo =新しいオブジェクト(); System.out.println(o.hashCode()); } } – krishnakumarp

+1

@BhavikAmbaniこれは用語集ですが、* JVM *はプラットフォームに依存しないで、プラットフォーム依存のJavaバイトコードを特定のプラットフォームで実行するプラットフォーム依存の部分です。 – hyde

関連する問題