类:
package com.ccc.demo03Class;
public class Person {
static {
System.out.println("静态代码块!");
}
}
测试类:
package com.ccc.demo03Class;
public class Demo02Reflect {
public static void main(String[] args) throws ClassNotFoundException {
/*
使用Class类中的forName方法获取class文件对象,会执行类中的静态代码块
*/
Class clazz = Class.forName("com.ccc.demo03Class.Person");
}
}
注意:静态代码块在类加载时调用,并且只调用一次
Java误区: 静态代码块,会在类被加载时自动执行?
静态代码块在类加载的时候不会执行,只有在类初始化的时候执行
当虚拟机载入某个 class文件
时,首先生成该 class文件
对应的类Class对象
,所以 Class.forName()
方法在进行类的加载时,生成了对应的 类的Class对象
,并且调用了其中的静态代码块。
但是反过来应该不成立,即你得到了该 class文件
对应的 类的Class对象
时(有点拗口,注意大小写),并不一定就加载了该 class文件对应的类
。类名.class
方法得到了对应的 Class对象
,但是并没有加载该类,没有加载自然就不会执行静态代码块的内容。如下图所示: