2015-05-22 69 views
5

我試圖運行此代碼:加載一個數組類加載器

public class ClassLoaderTest 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Object[] obj = new Object[]{}; 
    String cname = obj.getClass().getName(); 
    System.out.println(cname); 

    ClassLoaderTest.class.getClassLoader().loadClass(cname); 
    } 
} 

但它拋出一個ClassNotFoundException。有趣的是,如果我使用這條線:

Class.forName(cname); 

它工作得很好。

這是怎麼回事?

編輯: 我使用Java 6 println打印此:

[Ljava.lang.Object; 
+2

我猜你出於好奇心,因爲在java數組中,「類」是由vm生成的,所以加載它們是沒有意義的。 (你會加載組件類,然後創建一個數組,一個虛擬機將創建數組類) – morpheus05

+1

[Class.forName()vs ClassLoader.loadClass() - 可用於動態加載?](http:///stackoverflow.com/questions/8100376/class-forname-vs-classloader-loadclass-which-to-use-for-dynamic-loading) –

+0

數組類型確實是一個類;和'Class.forName()'javadoc允許它。 – ZhongYu

回答

3

他們並不相同,

Class.forName回報與類相關的對象給定的名字。

在你的例子中,你給loadClass一個String代表一個類的名字,而不是直接給它一個類。

此方法確實允許您提供名稱,但它必須是該類的binary name,而不僅僅是類名稱。

作爲String參數提供給ClassLoader中的方法的任何類名都必須是由The Java™Language Specification定義的二進制名稱。

1

首先,使用類加載器嘗試加載java.lang.Object數組不太可能工作(因爲java.lang.Object由默認類加載器加載)。接下來,名稱由

Object[] obj = new Object[]{}; 
String cname = obj.getClass().getName(); 
System.out.println(cname); 

[Ljava.lang.Object;。很明顯,這不是一個可以通過ClassLoader解決的類 - javadoc說(部分)類加載器是負責加載類的對象;注意它沒有說它負責加載數組。在反射中,數組處理的地址爲java.lang.reflect.Array,其中部分說Array類提供靜態方法來動態創建和訪問Java數組。這似乎是你在找什麼。