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语法,它看起来像变量类是type java.lang.Class and is static and public. 我的问题是这个变量在哪里定义?它不存在于 Test 类中(因为我没有声明它),它也不存在于 java.lang.Object 类中。

我看到了一个类似的方法public final native Class<?> getClass();。这存在于java.lang.Object并且是一个native java method. 此方法返回对象的运行时类。

所以我的问题是这个公共和静态类变量在哪里定义?(如果我弄错了,请纠正我)它又是一些本机实现吗?这是在编译时设置的,并且是静态的不需要创建类实例。因此,即使这是一些本机实现,它是由registerNatives()java.lang.Object 中的方法初始化的吗?

4

3 回答 3

5

这些被称为类文字,由语言本身根据JLS §15.8.2 定义(没有“class成员”):

文字是一个表达式,由类、接口、数组或原始类型或伪类型的名称组成void,后跟一个“.”。和令牌class

的类型C.class,其中C是类、接口或数组类型(第 4.3 节)的名称,是Class<C>

的类型p.class,其中p是原始类型的名称(第 4.2 节),是Class<B>,其中是装箱转换后B的类型表达式的类型(第 5.1.7 节)。p

void.class(§8.4.5)的类型是Class<Void>.

这些结构本质上内置于语言中的一个迹象是它们甚至可以与原语一起使用!

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语法上看起来像访问静态字段,但它只是一种特殊的语言语法。将其视为一种运算符。

JVM 可能会创建某种合成类来包装真实类并具有这样的字段,但这只是关于 JVM 中类的内部表示的假设。

于 2013-09-08T14:40:03.870 回答