下面是会对类进行初始化的情况:
- 当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)
- 当调用某个类的静态方法时
- 当使用某个类或接口的静态字段时
- 当调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时
- 当初始化某个子类时
- 当虚拟机启动某个被标明为启动类的类(即包含main方法的那个类)
Java编译器会收集所有的类变量初始化语句和类型的静态初始化器,将这些放到一个特殊的方法中:clinit。
Class.forName("A")相当于Class.forName("A",true,this.getClass().getClassLoader()) true参数代表对类A进行初始化。Class.forName("A",false,this.getClass().getClassLoader()) 就不会对类A进行初始化了。
ClassLoader的loadClass(String className);方法只会加载并编译某类,并不会对其执行初始化。