2011-03-15 19 views
2

私は、すべてのリファレンスについて、すべてのクラスのランタイム情報をイントロスペクトできるように、1つの不変クラスオブジェクト を作成しています。そして、サンは.class構​​文を使うことに言及しています。私はこの構文の内部メカニズムとその仕組みを知りたい。あなたはthe reflection tutorialリフレクションパッケージに関する質問

.class構文で開始したいことがあり

+0

http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.htmlクラスファイル形式の説明、それがあなたが探しているものならば。 – Nishan

+0

あなたはおそらくいくつかの答えを正しいものとして受け入れるべきです。あなたの質問に戻って、それぞれについて、あなたが一番正しい答えがあればそれをクリックしてください。 – Synesso

答えて

1

on this pageを説明した(いや、それは内部の仕組みを説明していません)

1

-target 1.4またはそれ以前のバージョンでコンパイルした場合は、Class.forName(String)は一度、その後と呼ばれていますClass参照は、呼び出し元クラスの合成静的フィールドに格納されます。 -target 1.5およびそれ以降については、新しいバージョンのldc( "load constant")バイトコード操作がクラスを参照します。

javap -cを使用すると、javacが生成するバイトコードを確認できます。

+0

私はJavaで数十年以上もコーディングしてきましたが、ここで何を言おうとしているのか分かりません。 ;) –

+1

@Peter: '.class'構文がコンパイルするバイトコードを説明しています。それはまた私に2つのパスを奪い取った;-) –

+0

@ジョアヒム、明確化のためにありがとう。 –

0

タイプ(クラス、インタフェース、配列タイプ、プリミティブ型)それぞれに、このクラスのロード時に作成されるClassオブジェクトがあります。このオブジェクトは、たとえば、クラスの静的変数を含むため、完全に変更できません。

オブジェクトがある場合は、o.getClass()を呼び出して、実装クラスのクラスオブジェクトを取得できます。タイプがある場合は、そのクラスオブジェクトをJavaのT.classで取得できます。

クラスオブジェクトから、コンストラクタ、メソッド、フィールド、スーパークラス、実装されたインターフェイスなどを取得するために、クラスを検査できます。これはリフレクションと呼ばれます。

(詳細は他の回答のリンクを参照してください。)

+0

"というクラスの静的変数を作成するので、?それについての参考資料を提供してもらえますか、私はこれが事実である(またはそのように指定されている)ことは間違いありません。 –

+1

@Joachim:(含む、作成しない)クラスオブジェクトのインスタンス変数であるという意味で静的変数を必ず含む必要はありませんが、少なくともクラスオブジェクトによって参照されるいくつかの記憶域にあります。概念的には、**はクラスオブジェクト**の一部です(文字が余分な配列内にあっても文字列やStringBuilderオブジェクトの一部です)。 –

+0

ŭlo:これは私が同意しないところです:私は 'Class'オブジェクト**が**クラスであるとは思わない。 'Method'オブジェクト**が**メソッドを表しているのと同じように、その表現/処理ですが、**メソッドと同じではありません。クラスとメソッド*はJava *のオブジェクトではなく、 'Class'と' Method'がクラスとメソッドと同一であれば、Javaは全く異なる言語になります。 –