反射中,Class.forName和classloader的區別?[中高]
阿新 • • 發佈:2018-11-19
相同點:
java中class.forName()和classLoader都可用來對類進行載入。
不同點:
class.forName()除了將類的.class檔案載入到jvm中之外,還會對類進行解釋,執行類中的static塊。
而classLoader只幹一件事情,就是將.class檔案載入到jvm中,不會執行static中的內容,只有在newInstance才會去執行static塊。
Class.forName(name, initialize, loader)帶參函式也可控制是否載入static塊。並且只有呼叫了newInstance()方法採用呼叫建構函式,來建立類的物件,可以看下原始碼,jvm底層可以控制。
參考程式碼:ClassloaderAndForNameTest
// 測試Class.forName和classloader的區別 public class ClassloaderAndForNameTest { public static void main(String[] args) { String className = "com.cto.edu.basic.ClassLoadObject"; System.out.println("以下是測試Classloader的效果:"); testClassloader(className); System.out.println("========================"); System.out.println("以下是測試Class.forName的效果:"); testForName(className); } private static void testClassloader(String className) { Class<?> c; ClassLoader loader = ClassLoader.getSystemClassLoader(); try { c = loader.loadClass(className); System.out.println("testClassloader: " + c.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private static void testForName(String className) { try { Class c = Class.forName(className); System.out.println("testForName:" + c.getName()); } catch (Exception e) { e.printStackTrace(); } } }