首先我們來了解一下什麼叫反射:
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數組對象.