Class.forName和ClassLoader的區別
阿新 • • 發佈:2019-03-06
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 staticString 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的區別