3

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

Class<?> stringClass = String.class;

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

我的问题是:

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

2 回答 2

1

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

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

于 2013-06-12T20:17:16.113 回答
1
  1. 根据这个问题Class每种类型的对象都是唯一的,因为您只有一个ClassLoader。不同 的对象可以为相同的类定义ClassLoaders产生不同的对象。Class
  2. Class对象是在类被加载时创建的 ,ClassLoader通常是在类第一次被引用时。
  3. 根据Java 语言规范,第 15.8.2 节Type.class是一个类文字,所以没有被调用;类文字指的是Class对象。

从上面链接的部分引用 JLS:

类字面量是由类、接口、数组或原始类型或伪类型 void 的名称组成的表达式,后跟一个“.”。和令牌类。

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

于 2013-06-12T19:49:52.497 回答