1

クラスの読み込みについて読んで、http://onjava.com/pub/a/onjava/2005/01/26/classloading.htmlに出くわしました-"...... Javaファイルをコンパイルするたびに、コンパイラは埋め込みます送信されたバイトコード内の、java.lang.Class型のclassという名前のpublic、static、finalフィールド。このフィールドはpublicであるため、次のようにドット表記を使用してアクセスできます。

java.lang.Class klass = Myclass.class; …………」

リフレクションを使用してこのフィールド(Myclass.class)にアクセスしようとしましたが、これは非常識ですが、同意しますが、それでも:) java.lang.NoSuchFieldException:classを取得します。

Myclass myObject = new Myclass; 
System.out.println(myObject.getclass().getField("class"));

それでは、静的な.classフィールドを追加するのはランタイムであり、コンパイラではありませんか?それでも、なぜリフレクションを使用してアクセスできないのですか?

4

2 に答える 2

1

これは、それ自体はフィールド アクセスではなく、単にフィールド アクセスのように見える Java 言語構文の表現です。コンパイラがそのような合成フィールドをクラスファイルに入れることは可能だと思いますが、そうするものは知りません。

于 2012-06-04T08:22:15.270 に答える
0

一般に、Java言語仕様では、この形式の式は対応するクラスオブジェクトを返す必要があると規定されていますが、これを行う方法は定義されていません。Eclipse JDTコンパイラーは、実際にはそれをフィールドにしません。myClass.classのようなものにアクセスするたびに呼び出される「$class」というメソッドを作成します。

于 2012-06-11T12:22:28.863 に答える