MyClass.class和Class.forName(“MyClass”)之间的差异静态行为

时间:2014-06-05 06:06:25

标签: java class static

我不确定在MyClass.classClass.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

有人可以给我解释一下吗? 非常感谢。

5 个答案:

答案 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时它没有加载类。