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

标签 java class

问题是关于 Java 的。获取一个类型的类的方式有3种(注意代码只是一些片段的集合,用于演示):

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();

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

但是方法 2 呢? 如果类尚未初始化,调用 .class 是否会初始化该类?
并且如何以编程方式检查类是否已初始化?

总结回答:

请查看已接受的解决方案及其评论以获得完整答案。这只是一个摘要。

调用 .class 不会初始化类,如果它还没有被初始化的话。您可以通过在打印消息的类定义中使用静态 block 来检查类是否正在初始化。

原始问题的原因:

根据 Class.forName 的 javadoc,“调用 forName("X") 会导致名为 X 的类被初始化。”。还有两个 Class.forName 方法,其中一个方法接受名为 initialize 的 boolean 参数。根据 javadoc,“仅当初始化参数为 true 且之前未初始化该类时才初始化该类。”

最佳答案

要不要自己测试一下,看看您的 VM 能做什么?

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

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

    public static int bananas = 0;
}

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

粗略地说,一个类应该在任何时候初始化

  • 创建第一个实例
  • 调用了一个static方法
  • 使用了一个非最终的static字段
  • 一些更复杂的极端情况

所以本质上,当您第一次使用实际类的任何内容时,而不仅仅是引用它。

但是例如Example.bananas = 1; 也应该在没有实例的情况下触发类初始化。

关于java - ".class"类的获取方式——是否初始化类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13739726/

相关文章:

Java - 具有多级类的列表集合 - 仅循环最后一个成员 - .stream() .forEach() .for()

python - 在 Python 中使用字符串作为切片索引? (类型错误: slice indices must be integers or None or have an __index__ method)

java - 如何在项目中找到不需要的jar

java - 如何使用 Waffle 检索用户的组/角色?

java - Java 中延迟程序执行的最佳实践(Android)

Python:将绑定(bind)方法更改为另一种方法

java - 列表列表上的等于方法

java - 无法通过更新标志更新数据流作业

python - 如何将类方法作为参数传递给该类外部的函数?

ruby - 在另一个类的方法中使用一个类的方法?