2013-05-14 17 views
5

私の質問は、実行時にクラス情報がどのように読み込まれるのかということです。RTTIとJavaのリフレクションの違い

誰かがinstanceofと呼んでいるのは、RTTIまたは反射と見なされますか?あるいはそれは実際の状況に依存しますか?

答えて

7

用語「RTTI」は、実行時にさまざまなオブジェクトの動的な型をプログラムが判断できるようにする、コア言語の機能を指すC++固有の用語です。通常、typeidによって生成されたstd::type_infoオブジェクトと一緒に、dynamic_castまたはtypeid演算子を指します。

一方、リフレクションという用語は、プログラムが実行時にオブジェクト、タイプなどを検査し修正する能力を指すプログラミング言語にわたって使用される一般的な用語です。プログラムが実行するアクションのどのような進路を決定するために実行されているタイプのを見て許可されているよう

instanceofに適用され、私が聞いた用語がtype introspectioninstanceofでは時々、オブジェクトイントロスペクションと呼ばれています。オブジェクトのフィールドやメソッドについて精巧なイントロスペクションを行うことはできないため、これはリフレクションよりも弱いと思いますが、オペレータのリフレクションを使用することは技術的には間違っているとは思われません。

その他の質問 - 実行時にクラス情報がどのように読み込まれるのですか?これは実際にはJVMの実装に依存します。 ClassLoaderタイプは最終的にシステムにクラスをロードする責任がありますが、JVMはこれを望みながら解釈することができます。私はかつてJavaScriptでプロトタイプのJVMを構築しました。内部的には、すべてのリフレクションコールは、クラス、フィールド、メソッドを表すための基盤となるJSデータ構造を照会しました。私はHotSpot JVMがまったく異なる何かをしていると思いますが、実装定義のほうがかなりです。

希望すると便利です。

+0

ありがとう!何とか私はJavaのコースでRTTIについて学びました。おそらく私は混乱していました.S – godlamp

2

要するに、RTTIとリフレクションの真の違いは、RTTIでは、コンパイラが開きコンパイル時に.classファイルを調べることです。リフレクションでは、.classファイルはコンパイル時に使用できません。実行時環境によって開かれ検査されます。

0

RTTIとリフレクションの真の違いは、RTTIでは、コンパイラが開きコンパイル時に.classファイルを調べることです。別の言い方をすれば、オブジェクトのすべてのメソッドを「通常の」方法で呼び出すことができます。リフレクションでは、.classファイルはコンパイル時に使用できません。実行時環境によって開かれ検査されます。 (с)

関連する問題