".class"获取类的方式 - 是否初始化类?

ADT*_*DTC 1 java class

问题是关于Java.获取类型的类有三种方法(请注意,代码只是用于演示的片段集合):

Class c1 = Class.forName("com.mypkg.MyClass"); //assumes initialize = true
// - OR - 
Class c1 = Class.forName("com.mypkg.MyClass", true/false,
                         this.getClass().getClassLoader());

Class c2 = com.mypkg.MyClass.class;
// - OR - 
import com.mypkg.MyClass;
Class c2 = MyClass.class;

MyClass mc = new MyClass();
Class c3 = mc.getClass();
Run Code Online (Sandbox Code Playgroud)

我的问题是关于初始化.对于方法1,我可以使用boolean参数控制是否初始化类.对于方法3,由于创建了一个对象,显然该类已初始化(对吗?).

但方法2怎么样?.class如果尚未初始化,是否调用初始化类?
如何能一个编程方式检查类是否已经被初始化或没有?

总结答案:

请参阅已接受的解决方案及其评论以获得完整答案 这只是一个总结.

.class如果尚未初始化,则调用不会初始化该类.您可以通过在打印消息的类定义中使用静态块来检查是否正在初始化类.

原始问题的原因:

根据javadoc的说法Class.forName,"对forName("X")的调用导致名为X的类被初始化." .还有两种Class.forName方法,包括一种接受名为initialize的布尔参数.根据javadoc,"仅当initialize参数为true且之前尚未初始化时才初始化类."

Ano*_*sse 5

如何自己测试,看看你的VM做了什么?

只需将这个类与所有三种方法一起使用(在独立运行中,因为它最多只能初始化一次!)

class Example {
    static {
        System.out.println("Class was initialized!");
    }

    public static int bananas = 0;
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,一个类应该被初始化,请参阅http://docs.oracle.com/javase/specs/#12.4.1

粗略地说,任何一个类都应该被初始化

  • 第一个实例已创建
  • static方法被调用
  • 使用非最终static字段
  • 一些更复杂的角落案例

基本上,当你第一次使用实际类的任何东西时,不只是引用它.

但是例如Example.bananas = 1;也应该触发类初始化,而不需要实例.