这是我的代码:
public class StupidClass {
static {
System.out.println("Stupid class loaded!");
}
}
还有我单独进行的测试。
import org.junit.Test;
public class StupidTest {
@Test
public void foo() throws ClassNotFoundException {
final Class<?> stupidClass = Class.forName("StupidClass");
System.out.println(stupidClass.getSimpleName());
}
@Test
public void bar() throws ClassNotFoundException {
final Class<StupidClass> stupidClassClass = StupidClass.class;
System.out.println(stupidClassClass.getSimpleName());
}
}
当我运行测试foo时,我会看到:
Stupid class loaded!
StupidClass
但是,当我运行测试栏时,我看到的只是:
StupidClass
引用此页面。
Java虚拟机会在加载类时以及通过调用类加载器中的defineClass方法自动构造类对象。
所以我的理解是,在测试栏中,加载了Stupid类,否则我会看到一个空值吗?因此创建Class对象是因为类本身已加载。
现在引用此页面
当JVM(具体来说是类加载器)加载StaticClass(在代码中首次引用它)时,将运行静态初始化块。
因此,我期望看到“愚蠢的类已加载!” 测试栏中的文本也可以,但我不是。
也引用了《用Java思考》
Candy,Gum和Cookie的每个类都有一个静态子句,该子句是在首次加载该类时执行的。
似乎不太准确。
我想念什么?