利用反射技術在泛型String集合中存入Integer元素
阿新 • • 發佈:2018-12-14
首先我們來了解一下什麼叫反射: JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。
需求:在不修改原始碼的情況下將泛型為 的Arraylist集合中存入Integer元素. 原理: 程式編譯後產生的.class檔案中是沒有泛型約束的,這種現象我們稱為泛型的擦除。我們可以通過反射技術,來完成向有泛型約束的集合中,新增任意型別的元素
程式碼演示如下:
package ArrayAdding; import java.lang.reflect.Method; import java.util.ArrayList; public class ArrayDemo { public static void main(String[] args) throws Exception { ArrayList<String> list = new ArrayList<String>(); list.add("array"); //獲得集合物件的Class類 Class cl =list.getClass(); //從集合Class類中獲取add()方法 引數為object Method method = cl.getMethod("add", Object.class); //方法喚醒並呼叫 傳入集合物件和需要儲存的元素 method.invoke(list, 123); method.invoke(list, 456); method.invoke(list, 789); System.out.println(list); } }
泛型擦除新增元素後我們列印集合 效果如下:
擦出泛型後的集合可以使用增強for迴圈遍歷,不過取出元素型別為object;當我們採用迭代器迴圈遍歷時,迭代器泛型任然為String,同樣能夠取出Integer型別元素,因為在集合內部是一個object陣列物件.