Java ObjectClass.class变量在哪里定义/初始化?
考虑下面的示例代码Java ObjectClass.class变量在哪里定义/初始化?,java,class,Java,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语法,看起来变量类属于类型java.lang.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
语法,看起来变量类属于类型java.lang.class,并且是静态和公共的
。我的问题是这个变量是在哪里定义的?它不在测试类中(因为我没有声明它),也不在java.lang.Object类中
我看到了一个类似的方法public final本机类getClass()代码>。这出现在java.lang.Object
中,是一种本地java方法
。此方法返回对象的运行时类
所以我的问题是,这个公共静态类变量是在哪里定义的?(如果我弄错了,请纠正我)它又是某种本机实现吗?这是在编译时设置的,并且是静态的,不需要创建类实例。所以,即使这是一些本机实现,它也是由java.lang.Object中的registerNatives()
方法初始化的吗 这些被称为类文本,由语言本身根据定义(没有“class
member”):
类文字是一个表达式,由类、接口、数组或基元类型的名称或伪类型void
,后跟“.”和标记类组成
C.class
的类型是class
,其中C
是类、接口或数组类型(§4.3)的名称
p.class
的类型,其中p
是基本类型的名称(§4.2),是class
,其中B
是装箱转换后p
类型表达式的类型(§5.1.7)
void.class
(§8.4.5)的类型为class
有一个迹象表明,这些结构本质上是内置在语言中的,那就是它们甚至可以与原语一起工作
System.out.println(int.class);
System.out.println(double.class);
// etc.
class
不是正常的静态变量。它是一种在编译时被替换的语言结构
由于class
是一个关键字,因此甚至不可能用该名称声明变量。您对class
是classclass
的静态字段的假设是不准确的。假设这是正确的。在这种情况下,对于所有错误的类,此字段的值将完全相同
虽然MyClass.class
在语法上看起来像是对静态字段的访问,但它只是语言的一种特殊语法。把它看作一种操作符
可能JVM创建了某种合成类,它封装了真实的类并具有这样的字段,但这只是JVM中类的内部表示的一个假设 它是语言的一部分,没有在任何地方的代码中定义。“它看起来像变量class
的类型是java.lang.class
,是static
和public
”,它当然看起来像一个字段,但它不是。