1. 程式人生 > >Class.forName和ClassLoader的區別

Class.forName和ClassLoader的區別

exception 調用 ets 測試 簡單的 gets ref static ade

看名字就知道了,一個是類的創建,一個類加載器

再看下Class.forName源碼,調用了ClassLoader

    @CallerSensitive
    public static Class<?> forName(String className)
                throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true
, ClassLoader.getClassLoader(caller), caller); }

那麽他們的關系就是簡單的包含關系了

寫個測試方法測試一下

public class SimpleClass {

    //靜態代碼塊
    static {
        System.out.println("執行了靜態代碼塊");
    }

    //靜態變量
    private static String staticFiled = staticMethod();

    //賦值靜態變量的靜態方法
    public static
String staticMethod() { System.out.println("執行了靜態方法"); return "給靜態字段賦值了"; } public static void main(String[] args) throws ClassNotFoundException { Class.forName("com.lgp.SimpleClass"); System.out.println("#########分割符##########"); ClassLoader.getSystemClassLoader().loadClass(
"com.lgp.SimpleClass"); } }

預期結果

執行了靜態代碼塊
執行了靜態方法
#########分割符##########

所以Class.forName和ClassLoader的區別是

Class.forName加載並初始化了一個類

ClassLoader僅加載了類

Class.forName和ClassLoader的區別