4

以下のサンプルコードを検討してください

 public class Test {

    public static void main(String args[]) {

        Test t = new Test();
        Class c2 = Test.class;
        System.out.println(c2);

    }
}

Test.classコンパイル時の Class オブジェクトを静的に評価して返します。構文を見るTest.classと、変数 class は of のようですtype java.lang.Class and is static and public。私の質問は、この変数がどこに定義されているかです。Test クラスには存在しません (宣言していないため)、java.lang.Object クラスにもありません。

類似の方法を見ましたpublic final native Class<?> getClass();。これは にjava.lang.Objectあり、native java methodです。このメソッドは、オブジェクトのランタイム クラスを返します。

だから私の質問は、この public および static クラス変数が定義されている場所は?(間違っている場合は修正してください) また、ネイティブ実装ですか? これはコンパイル時に設定され、静的であるため、クラス インスタンスを作成する必要はありません。これがネイティブ実装である場合でもregisterNatives()、java.lang.Object のメソッドによって初期化されますか?

4

3 に答える 3

5

これらはクラス リテラルと呼ばれ、 JLS §15.8.2に従って言語自体によって定義されます(「classメンバー」はありません)。

クラス リテラルは、クラス、インターフェイス、配列、プリミティブ型、または疑似型の名前の後voidに「.」が続く式です。とトークンclass

の型 (はクラスC.classCインターフェイス、または配列型 (§4.3) の名前) は ですClass<C>

の型、p.classpプリミティブ型の名前 (§4.2)、 は ですClass<B>。はボックス化変換後Bの型の式の型ですp(§5.1.7)。

void.class(§8.4.5)の型は ですClass<Void>

これらの構造が本質的に言語に組み込まれていることを示す 1 つの兆候は、それらがプリミティブでも機能することです!

System.out.println(int.class);
System.out.println(double.class);
// etc.
于 2013-09-08T14:37:31.897 に答える
1

class通常の静的変数ではありません。これは、コンパイル時に置き換えられる言語構造です。

はキーワードであるためclass、その名前の変数を宣言することさえできません。

于 2013-09-08T14:37:47.263 に答える
0

classクラスの静的フィールドであるというあなたの仮定Classは正確ではありません。これが正しいと仮定します。この場合、このフィールドの値は、間違っているすべてのクラスでまったく同じになります。

MyClass.class構文的には static フィールドへのアクセスのように見えますが、これは単なる言語の特殊な構文です。これを一種の演算子と考えてください。

おそらくJVMは、実際のクラスをラップし、そのようなフィールドを持つある種の合成クラスを作成しますが、それはJVMのクラスの内部表現に関する単なる仮定です.

于 2013-09-08T14:40:03.870 に答える