我不确定在MyClass.class
和Class.forName("MyClass")
之间加载静态变量/块的区别是什么,例如,我有以下类:
package test;
public class SampleClass{
public static SampleClass instance = new SampleClass();
private SampleClass(){
System.out.println("SampleClass Instance Created");
}
}
然后,在另一个类中,我使用:
访问上面SampleClass的类对象System.out.println(SampleClass.class);
然后,输出将是:
class test.SampleClass
如果我更改为使用class.forName()
,如下所示:
System.out.println(Class.forName("test.SampleClass"));
然后,输出将是:
SampleClass Instance Created
class test.SampleClass
有人可以给我解释一下吗? 非常感谢。
答案 0 :(得分:4)
对Class.forName("MyClass")
的调用导致在运行时加载类。 JVM还在类加载器加载类之后初始化该类,因此static
块被执行。
在你的情况下,你有一个静态字段,它是你的类的实例,因为这个静态块被执行,你的对象正在被初始化。这就是你看到System.out被打印的原因。
.class
语法用于获取被调用类的Class
。它实际上并没有加载这个类。
答案 1 :(得分:2)
Class.forName()
使用ClassLoader并尝试在运行时解析类名,而.class
在编译时解析。
答案 2 :(得分:1)
class.forName()
使用“调用者”类加载器加载类。
.class
未加载该类。
答案 3 :(得分:0)
它只是因为Class.forName()
在运行时动态加载你的类到内存(RAM)。它将执行此类中的所有静态块,而不创建该类的引用,
来自官方文件:
对Class.forName(“X”)的调用会导致名为X的类被动态加载(在运行时)。对forName(“X”)的调用导致名为X的类被初始化(即,JVM在类加载后执行其所有静态块)。 Class.forName(“X”)返回与“X”类关联的Class对象。返回的Class对象不是“x”类本身的实例。
Class.forName(“X”)加载该类(如果尚未加载)。 JVM 跟踪之前加载的所有类。这个 method使用调用它的类的类加载器。 “X”是 所需类的完全限定名称。
以下是有关它的更多信息:http://www.xyzws.com/Javafaq/what-does-classforname-method-do/17
答案 4 :(得分:0)
谢谢大家的回答和讨论。
我认为无论使用Class.forName()还是MyClass.class都会加载类,显然我错了。但是我不明白为什么在使用MyClass.class时它没有加载类。