java Class.forName和ClassLoader的区别

首先了解类的加载过程

ClassLoader: 抽象类,遵循双亲委派模型,A typical strategy is to transform the name into a file name and then read a "class file" of that name from a file system.

ClassLoader加载类的时候,不会进行初始化

Class.forName方法实际上也是调用的ClassLoader来实现的

最后调用的方法是forName0()方法,方法中的第2个参数默认设置为了true,该参数表示是否对加载的类进行初始化,设置为true时会对类进行初始化,这就意味着会执行类中的静态代码块以及对静态变量的赋值等操作.

示例代码

package com.design.pattern.temp;

class Super {
    static {
        System.out.print("Super ");
    }
}

class One {
    static {
        System.out.print("One ");
    }
}

class Two extends Super {
    static {
        System.out.print("Two ");
    }
}

ClassLoader加载类

        ClassLoader classLoader = ClassLoader.getSystemClassLoader();
        Class<Two> aClass = (Class<Two>) classLoader.loadClass("com.design.pattern.temp.Two");

 输出结果:空

Class.forName 加载类

Class<?> aClass1 = Class.forName("com.design.pattern.temp.Two");

输出结果:Super Two 

 

posted @ 2017-07-19 08:50  newlangwen  阅读(154)  评论(0编辑  收藏  举报