把《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中的泛型在编译后的运行过程中是去泛型化的。
上面程序的运行结果如下: