2014-03-04 71 views
0

我有一個定製的ClassLoader:CustomClassLoader(擴展類加載器)類和類加載器

我有一個類:IntegerPrint

我打開我的課我定製的ClassLoader。我期待下面的代碼中的SOP返回相同的值。但第一個SOP打印「sun.misc.Launcher $ AppClassLoader @ ..」&秒SOP打印「CustomClassLoader @ ..」

爲什麼會發生這種情況?請指教。

public class IntegerPrinterTest { 
    public static void main(String[] args) throws Exception { 
     CustomClassLoader loader = new CustomClassLoader(IntegerPrinterTest.class.getClassLoader()); 
     Class<?> clazz = loader.loadClass("IntegerPrinter"); 
     System.out.println(IntegerPrinter.class.getClassLoader()); 
     System.out.println(clazz.getClassLoader()); 
    } 
} 

回答

2

你期望什麼? 在

System.out.println(IntegerPrinter.class.getClassLoader()); 

創建

Class<IntegerPrint> 

對象,當然,它的類(Class)必須已經被一些類加載器加載。沒有天才可以想象,即使在你的代碼獲得控制權之前,它也必須很早被加載。

java -verbose:class .... 

運行的例子來看看哪些類以什麼順序laoded。

2

第一個電話:

IntegerPrinter.class.getClassLoader() 

居然會做:

IntegerPrinterTest.class.getClassLoader().loadClass("IntegerPrinter") 

所以它完全忽略了你定製的ClassLoader。換句話說:您自己的類加載器實際上並不是用於使用像「new」等本地調用創建的任何對象。要做到這一點,它也應該負責加載IntegerPrinter類。

這是相當謹慎(和一般沒用)做在同一個班,但你可以這樣做:

Class<?> clazz = loader.loadClass("IntegerPrinterTest"); 
clazz.getMethod("main").invoke(null); 

(注意此代碼未經測試,但應接近一些作品)