02.09 動態加載不適合數組

如果forName要加載一個類,那它首先必須是一個類___8個基本類型排除在外,它們不是一個具體的類;其次,它必須具有可追溯的類路徑,否則就會報ClassNotFoundException。

在Java中,數組是一個非常特殊的類,雖然它是一個類,但沒有定義類類路徑,例如這樣的代碼:

動態加載不適合數組

String []是一個類型聲明,它作為forName的參數應該也是可行的吧!但是非常遺憾,其運行結果如下:

動態加載不適合數組

產生ClassNotFoundException異常的原因是數組算是一個類,在聲明時可以定義為String[],但編譯器編譯後為不同的數組類型生成不同的類,具體如下表所示:

<table><tbody>數組編譯對應關係表
元素類型編譯後的類型byte[][Bchar[][C
Double[][DFloat[][FInt[][ILong[][JShort[][S
Boolean[][Z引用類型(如String[])[L引用類型(如:[Ljava.lang.String;)/<tbody>/<table>

在編碼期,我們可以聲明一個變量為String[],但是經過編譯後就成為了[Ljava.lang.String。明白了這一點,再根據以上的表格可知,動態加載一個對象數組只要加載編譯後的數組對象就可以了,代碼如下:

動態加載不適合數組

雖然以上代碼可以加載一個數組類,但這是沒有任何意義的,因為它不能產生一個數組對象,也就是說以上代碼只是把一個String類型的數組類和Long類型的數組類加載到了內存中(如果內存中沒有改類的話),並不能通過newInstance方法生成一個實例對象,因為它沒有定義數組的長度,在Java中數組是定長的,沒有長度的數組是不允許存在的。

既然反射不能定義一個數組,那問題就來了:如何動態加載一個數組呢?比如依據輸入動態生成一個數組。其實可以使用Array數組反射類動態加載,代碼如下:

動態加載不適合數組

因為數組比較特殊,要想動態創建和訪問數組,基本的反射是無法實現的,“上帝對你關閉一扇門,同時會為你打開一扇窗。”,於是Java就專門定義了一個Array數組反射工具類來實現動態探知數組的功能。

注意:通過反射操作數組使用Array類,不要採用通用的反射處理API。

有討論,才有進步,大家各抒己見,讓每位同學學到不一樣的!


分享到:


相關文章: