1. 程式人生 > >反射中,Class.forName和classloader的區別?[中高]

反射中,Class.forName和classloader的區別?[中高]

相同點:
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();
		}
	}
	
}