问题是关于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();
我的问题是关于初始化。对于方法 1,我可以使用布尔参数控制类是否被初始化。对于方法3,由于创建了一个对象,显然该类已初始化(对吗?)。
但是方法2呢?.class
如果尚未初始化,调用是否会初始化该类?
以及如何以编程方式检查一个类是否已经初始化?
总结答案:
请参阅已接受的解决方案及其评论以获取完整答案。这只是一个总结。
如果尚未初始化,则调用.class
不会初始化该类。您可以通过在打印消息的类定义中使用静态块来检查类是否正在初始化。
原始问题的原因:
根据 javadoc Class.forName
,“调用 forName("X") 会导致初始化名为 X 的类。” . 还有两种Class.forName
方法,包括一种接受名为initialize的布尔参数的方法。根据 javadoc,“只有当 initialize 参数为真并且之前没有初始化时,才会初始化该类。”