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

时间:2013-09-08 14:32:59

标签: 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静态计算并返回编译时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()方法初始化的吗?

3 个答案:

答案 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中类的内部表示的假设。