转帖自 http://www.javaeye.com/topic/11003
- public interface Assembly{
- public void start();
- }
- public class Word implements Assembly{
- static{
- System.out.println("Word static initialization!");
- }
- public void start(){
- System.out.prinlnt("Word starts");
- }
- }
- public class Office{
- public static void main(String args[]) throws Exception{
- Office off = new Office();
- System.out.println("类准备载入");
- Class c = Class.forName(args[0],true,off.getClass().getClassLoader());
- System.out.println("类准备实例化");
- Object o = c.newInstance();
- Object o2= c.newInstance();
- }
- }
执行java Office Word,运行结果如下:
- “Loaded Office”
- “类准备载入”
- “Loaded Accembly”
- “Loaded Word””
- “Word static initialization”
- “类准备实体化”。
但是如果将Office.java中Class.forName(args[0],true,off.getClass().getClassLoader())中的true变为false,
即: Class.forName(args[0],false,off.getClass().getClassLoader())
再执行java Office Word结果显示为:
- “Loaded Office”
- “类准备载入”
- “Loaded Accembly”
- “Loaded Word””
- “类准备实体化”
- “Word static initialization”。
一个类的运行,JVM做会以下几件事情
1、类装载
2、链接
3、初始化
4、实例化;
而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。
所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。在类被初始化的时候,仅仅调用一次。