import java.lang.reflect.Field;
import java.lang.reflect.Method;
class InitClass{
static {System.out.println("初始化 InitClass");
}
public static String a = null;
public static void method(){}
}
class SubInitClass extends InitClass{}
public class Test1 {
/**
* 主动引用引起类的初始化的第四种情况就是运行 Test1 的 main 方法时
* 导致 Test1 初始化,这一点很好理解,就不特别演示了.
* 本代码演示了前三种情况,以下代码都会引起 InitClass 的初始化,
* 但由于初始化只会进行一次,运行时请将注解去掉,依次运行查看结果.
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
// 主动引用引起类的初始化一: new 对象,读取或设置类的静态变量,调用类的静态方法.
// new InitClass();
// InitClass.a = "";
// String a = InitClass.a;
// InitClass.method();
// 主动引用引起类的初始化二:通过反射实例化对象,读取或设置类的静态变量,调用类的静态方法.
// Class cls = InitClass.class;
// cls.newInstance();
// Field f = cls.getDeclaredField("a");
// f.get(null);
// f.set(null, "s");
// Method md = cls.getDeclaredMethod("method");
// md.invoke(null, null);
// 主动引用引起类的初始化三:实例化子类,引起父类初始化.
// new SubInitClass();
}
}
来源: https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247484796&idx=1&sn=c71933213a5435f3a7dfd1ddea34dfc8&chksm=ebd63a50dca1b346ed41498c71f11e1081a675d6f0d4a95e68325e57155cb44f2d1bf4e1efa7#rd