Java中Class.forName和classloader都可以用來對類進行加載。
Class.forName除了將類的.class文件加載到jvm中之外,還會對類進行解釋,執行類中的static塊。
而classloader只干一件事情,就是將.class文件加載到jvm中,不會執行static中的內容,只有在newInstance才會去執行static塊。
Class.forName(name,initialize,loader)帶參數也可控制是否加載static塊。並且只有調用了newInstance()方法采用調用構造函數,創建類的對象。
package com.yu.java.reflect; public class Line { static { System.out.println("static code executing: loading line..."); } }
package com.yu.java.reflect; public class Point { static { System.out.println("static code executing: loading point..."); } }
package com.yu.java.reflect; public class ClassLoaderAndForNameTest { public static void main(String[] args) { String wholeNameLine = "com.mangosoft.java.reflect.Line"; String wholeNamePoint = "com.mangosoft.java.reflect.Point"; System.out.println("classloader testing..."); testClassLoader(wholeNameLine, wholeNamePoint); System.out.println("---------------------------------------"); System.out.println("Class.forName testing..."); testForName(wholeNameLine, wholeNamePoint); } //classloader public static void testClassLoader(String wholeNameLine, String wholeNamePoint) { ClassLoader loader = ClassLoader.getSystemClassLoader(); Class<?> line; Class<?> point; try { line = loader.loadClass(wholeNameLine); point = loader.loadClass(wholeNamePoint); System.out.println("line " + line.getName()); System.out.println("point " + point.getName()); } catch (ClassNotFoundException e){ e.printStackTrace(); } } //Class.forName public static void testForName(String wholeNameLine, String wholeNamePoint) { try { Class line = Class.forName(wholeNameLine); Class point = Class.forName(wholeNamePoint); System.out.println("line " + line.getName()); System.out.println("point " + point.getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
運行結果如下:

