2013-06-12 15 views
3

在Java中,你可以写出下面的代码会发生什么:爪哇 - 了解<?>类类型和调用时“Type.class”

Class<?> stringClass = String.class;

的运行时间将分配给类实例的引用表示java.lang.String类的类型。

我的问题是:

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

回答

1
  1. this question,每种类型Class对象是 唯一的,因为你只有一个ClassLoader。不同的 ClassLoaders可以为相同的 类定义生成不同的Class对象。
  2. Class对象是在类加载之前创建的,通常是在第一次引用类时由 ClassLoader加载。
  3. 根据Java Language Specification, Section 15.8.2,Type.class类文字,所以没有被调用;类文字是指Class对象。

从部分引述JLS上面链接:

类文字是由一个类, 接口,数组或基本类型或伪型空隙的名称的表达,后跟 由'。'和令牌类。

A作为由定义的类装载器定义的类字面的计算结果为为命名类型(或 为无效)的Class对象(§12.2)当前实例的 类的。

1

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

我记得在老版本的Java中情况并非如此; Foo.class被编译成类似Class.forName("Foo")的东西,并且加载是相当懒惰和按需。