考虑下面的示例代码
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
。此方法返回对象的运行时类。
所以我的问题是这个公众&amp;静态类变量定义了吗?(如果我弄错了请纠正我)是否还有一些原生实现?这是在编译时设置的,静态不需要创建类实例。因此,即使这是一些本机实现,它是由java.lang.Object中的registerNatives()
方法初始化的吗?
答案 0 :(得分:5)
这些被称为类文字,并由语言本身根据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.
答案 1 :(得分:1)
class
不是正常的静态变量。它是一种语言结构,在编译时被替换。
因为class
是关键字,所以甚至不可能声明具有该名称的变量。
答案 2 :(得分:0)
您假设class
是类Class
的静态字段并不准确。假设这是正确的。在这种情况下,对于所有错误的类,此字段的值将完全相同。
尽管MyClass.class
在语法上看起来像访问静态字段,但它只是一种特殊的语言语法。把它想象成一种运营商。
可能JVM创建了某种包含真实类的合成类,并且具有这样的字段,但它只是关于JVM中类的内部表示的假设。