ObjectClass在哪里定义/初始化.class变量



考虑下面的示例代码

 public class Test {
    public static void main(String args[]) {
        Test t = new Test();
        Class c2 = Test.class;
        System.out.println(c2);
    }
}

Test.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。此方法返回对象的运行时类。

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

这些

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

文本是由类、接口、数组或基元类型的名称或伪类型void组成的表达式,后跟 '." 和标记 class

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

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

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

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

System.out.println(int.class);
System.out.println(double.class);
// etc.

class不是正常的静态变量。它是一种在编译时被替换的语言结构。

因为class是一个关键字,所以甚至不可能声明具有该名称的变量。

你假设class是类Class的静态字段是不精确的。假设这是正确的。在这种情况下,对于所有错误的类,此字段的值将完全相同。

尽管MyClass.class语法上看起来像是对静态字段的访问,但它只是一种特殊的语言语法。将此视为一种运算符。

可能JVM

创建了某种合成类,它包装了真正的类并具有这样的字段,但它只是对JVM中类的内部表示的假设。

最新更新