http://blog.csdn.net/wizardmly/article/month/2010/12
Java基礎知識加強視頻的學習:
一、知識點:
21、成員變數反射的綜合執行個體: 將任意一個對象中的所有String類型的成員變數所對應的字串中的“b”改成“a”。
(1)、P124:當比較的兩個對象的所引用的值,都只有一份值,那麼我們可以使用 == 來比較。
(2)、對位元組碼使用方法getFields(),得到位元組碼內所有的欄位,用Field類的對象數組返回。
(3)、對象.getType() 方法返回的是對象所在的類位元組碼。
22、成員方法的反射:反射到類Method中
(1)、Method 代表類中的一個方法,與成員變數的反射類似,對應的只是類的位元組碼中的成員方法的欄位
(2)、如何得到類中的一個方法:
(3)、調用方法:Method對象.invoke(obj,parameterType list),Method對象執行方法invoke調用,調用Method對象對指的方法,而調用該方法的
象是obj,調用obj中的哪個重載版本方法,我們用parameterType list 來匹配它。
(4)、當方法為靜態方法時,上述方法invoke參數表中的obj不需要執行個體對象,可直接改為 null 來調用該方法,因為靜態方法不依賴對象存在。
23、對接收數組參數的成員方法進行反射:
(1)、在Eclipse中,當我們需要一個完整的類名的時候,在程式中選中一個類名,然後按F2,那麼將得到完整的類名。
(2)、//1、 如果直接用語句:mainMethod.invoke(null, new String[]{"111","222","333"});調用main()方法
// 編譯器將報錯,因為,在JDK1.5中,為了相容JDK1.4中的調用方式,編譯器將會對數組String[]{...}進行拆包動作
// 而該數組拆包之後,得到的String[0],String[1],String[2]中的每個元都自動拆包成對應的裝箱類型,每一個
// 元都當做一個數組,數組中的每個元都是一個裝箱類型,即有3個數組。
//2、 用以下方法進行輸出時,將String[]{...} 作為 Object[]數組的一個元,那麼編譯器對數組Object[]拆包的時候,
// 得到的是String[]{...}
// mainMethod.invoke(null, new Object[] {new String[]{"111","222","333"}});
//3、 數組也是一個Object的子類對象,那麼當我們用以下輸出的時候,將String[]強制轉換為一個Object對象,那
// 麼編譯器將無法對之進行拆包,傳給main()方法的也是整個 String[]{...}數組
mainMethod.invoke(null, (Object)new String[]{"111","222","333"});
(3)、在運行一個類的時候,如果類中有main()函數,那麼,我們可以像該方法傳遞一個字串數組String[] args ,形參名為args。那麼,在main()方法
中,我們可以利用args形參名,來調用傳遞給我們的字串數組。特別的,當這個字串數組,是一個完整類名的時候,我們可以利用該形參來進行
求得該類的位元組碼,以便求得該位元組碼的各種成分。
(4)、如何給類中main()方法字串數組參數String[] args,以至於可以在main()方法中直接調用該字串。
在Java程式地區 右擊 --> Run As -->Run Configuration(運行相關配置) --> 在Argument欄中,填入需要傳遞的實參,該實參將傳遞給類mai()方法
24、數組與Object的關係及其反射類型:
(1)、數組的反射:數組也是一種類型,每一個具有相同的元素類型和維數的數組,都屬於同一個Class(位元組碼),。
(2)、在返數組對象的位元組碼名字的時候,得到“[I” ,其中,中括弧“[”表示數組,並且,多少個“[”,表示多少維的數組“I”表示整數。
可以在類Class的getName()方法中查閱相關知識。
(3)、得到某個類的超類,我們使用方法:對象名.getClass().getSuperclass().getName().
我們對數群組類型變數使用(3)的方法,我們得到他們的超類都是Object。
(4)、如何直接列印數組的全部元素:利用類Arrays中的方法asList() :Arrays.asList(“數組名”),那麼我們將得到該數組的值列表。
(5)、Arrays.asList()方法處理int[]和String[]時的差異:
String[]數組中的String對象都是Object對象,而int[]數組中的int元,只是基本類型,不是一個Object對象。
傳遞給asList()的實參,如果是String[]數組,那麼,數組中的每個元都是Object對象。如果是int[]數組,數組中的元,都是一個基本 類型,不是Object。在JDK1.4中,傳遞給asList()方法的實參,是Object[]數組,而在JDK1.5以及以上版本中,利用了可變參數來實現。當我們傳遞String[]數組給形參時,由於上述String[]的特性,即正確的傳遞了實參給asList()方法。但是,當我們傳遞給int[]數組給形參時,由於int[]數組的上述特性,錯誤的傳遞了形參,那麼,返回JDK1.5以上的版本,使之處理,而在該處理中,實參int[]將當做一個Object對象,即只能返回該對象的數群組類型和散列碼。
二、問題與收穫:
(1)、JDK1.4沒用引入可變參數,是在1.5中引入的,而且JDK1.5中新增了自動裝箱功能,
(2)、當我們按JDK1.4的文法來調用invoke方法時,參數列表使用數組來傳遞,如Object[] {2}, 但是,為何另數組元數有多個時,如{2,1,0},編譯器報錯?
(3)、在看視頻的時候,老師定義了幾個數組,然後進行比較,在Eclipse中代碼不報錯,但是,我自己啟動並執行時候,出現了如下錯誤:
Incompatible operand types Class<capture#8-of ? extends int[]> and Class<capture#9-of ? extends int[][]>
解析:查閱了網上的資料,解釋如下:
對於數群組類型的變數編譯器在編譯時間,其實已經知道類型了。也就是說,編譯器認為這2個類型是不一樣的。根本沒有比較的需要。
對於總是不成立的比較,其實是沒有意義的。這個編譯錯誤是 JDK 1.6的新功能
而老師使用的恰好是JDK1.5的版本,我使用的是1.6版本。