考虑下面的示例代码
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中类的内部表示的假设。