一
看名字就知道了,一個是類的創建,一個類加載器
二
再看下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僅加載了類