Java - 理解类<! - ? - >类型以及调用'Type.class'时会发生什么

时间:2013-06-12 19:31:26

标签: java class singleton

在Java中,您可以编写以下代码:

Class<?> stringClass = String.class;

运行时将分配对Class实例的引用,表示类型为java.lang.String类。

我的问题是:

  1. JVM是否保证Class实例是每个Java类型的单例?
  2. 如果#1的答案为真 - 何时创建Class实例? ( - 调用getClass()Type.class或者当类加载器第一次加载Java类型时。)
  3. 调用Type.class时会发生什么。我问,因为在课程代码中没有名为class的静态成员。

2 个答案:

答案 0 :(得分:1)

  1. 根据this question,每种类型的Class个对象是 因为你只有一个ClassLoader,所以是唯一的。不同 ClassLoaders可以为同一个产生不同的Class个对象 课程定义。
  2. 当a加载类时,会创建Class个对象 ClassLoader,通常在首次引用该类时。
  3. 根据Java Language Specification, Section 15.8.2Type.class类文字,因此不会调用任何内容; class literal引用Class对象。
  4. 从上面链接的部分引用JLS:

      

    类文字是一个由类名称组成的表达式,   接口,数组或基本类型,或伪类型void   一个'。'和令牌类。

      

    类文字计算命名类型的Class对象(或   for void)由类的定义类加载器(第12.2节)定义   当前实例。

答案 1 :(得分:1)

似乎表达式Foo.class被编译为常量池的简单查找,至少在javac7上。因此,在加载此类时,可能会加载Foo.class

我记得在旧版本的Java中并非如此; Foo.class被编译成类似Class.forName("Foo")的内容,并且加载非常懒惰并且按需提供。