例子:有一个ArrayList的对象,需要存储一个字符型数据,如何实现?
首先,泛型是在编译期就能检查,防止不正确的数据,而反射是由类字节文件来实现取得类的成员、构造以及方法,通过反编译文件可以看到,在执行文件中并没有类型的限制,因此可以用反射机制来实现。
package cn.itcast_01;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
/*
* 有一个ArrayList<Integer> 的一个对象,要存储一个字符型数据
*/
public class ReflectDemo {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
ArrayList<Integer> array = new ArrayList<Integer>();
//泛型类型检查是给编译器看的,真正执行的原码中没有类型检查,所以可以使用反射来实现绕过泛型检查
Class c = array.getClass();
Method m1 = c.getMethod("add", Object.class);
m1.invoke(array, "hello");
System.out.println(array);
}
}