可能重複的區別:
Difference betweeen Loading a class using ClassLoader and Class.forName什麼ClassLoader.load(名稱)和的Class.forName(名稱)
據我所知,在的Java提供了兩種方法來初始化一個名字的類。
類
公共靜態類的forName(字符串 的className)拋出 ClassNotFoundException的
公共靜態類的forName(字符串 名,布爾初始化,類加載器 裝載機)拋出的ClassNotFoundException
的ClassLoader:
公共類的loadClass(字符串 名)拋出的ClassNotFoundException { 回報的loadClass(姓名,假); }
已知的是在的forName方法,我們可以指定初始化的標誌是假,這將跳過某些該類被初始化靜態的東西。但是還有什麼? 我應該如何正確使用它們?
最好你可以展示一些很好的例子。
謝謝!
UPDATE:
提出的問題後,我做了一些簡單的類加載器的測試。
ClassLoader cls = ClassLoader.getSystemClassLoader();
Class someClass = cls.loadClass("Test");
Class someClass0= Class.forName("Test");
Class someClass1= Class.forName("Test",false,cls);
URL[] urls = new URL[] {new File("bin/").toURL()};
ClassLoader cls2 = new URLClassLoader(urls, null);
Class someClass2 = cls2.loadClass("Test");
ClassLoader cls3 = new URLClassLoader(urls, cls);
Class someClass3 = cls3.loadClass("Test");
System.out.println(someClass.equals(someClass0));
System.out.println(someClass.equals(someClass1));
System.out.println(someClass.equals(someClass2));
System.out.println(someClass.equals(someClass3));
結果是
真,真,假,真
UPDATE
這是我約
Difference between loadClass(String name) and loadClass(String name, boolean resolve)
@Bohemian我已閱讀的鏈接,我沒有看到任何人強調說的Class.forName將初始化靜態的東西還包括靜態塊和靜態變量的區別。另外這兩個方法實際上終於調用了不同的本地方法,private native void esolveClass0(Class c);私有靜態本地Class forName0(字符串名稱,布爾初始化,ClassLoader加載器)拋出ClassNotFoundException;它會導致差異嗎? –