利用反射技術在泛型String集合中存入Integer元素

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章