把《JAVA核心技術》(卷一)的反射部分看完後,仍然迷迷糊糊。聽另一位大神的話,去看了網上的一個視頻,慕課網一位老師講的,非常好。這裏摘取他的最後一個例子看一下。
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.lang.Object.*;
public class fanshe {
public static void main(String[] args){
ArrayList<String> list1=new ArrayList();
ArrayList list=new ArrayList();
list1.add("hello");
try
{
Class c=list1.getClass();Method m=c.getMethod("add",Object.class);
m.invoke(list1, 100);
}
catch(Exception e)
{
System.out.println("error");
}
System.out.println(list1);
}
}
這段代碼的巧妙之處在於他通過反射機制繞開了編譯中的檢查輸入,結果硬生生的把一個整型數據加到一個泛型String數組列表中。
虛擬機裏類的加載分兩種:
1.靜態加載,編譯的時候就加載,比如new語句;
2.動態加載,編譯時不加載,運行時加載,比如反射語句系列;
這裏我們就巧妙的運用反射機制避開了代碼編譯時對輸入的檢查。
同時也證明了一點:
JAVA中的泛型在編譯後的運行過程中是去泛型化的。
上面程序的運行結果如下: