黑马程序员技术交流社区

标题: Java反射绕过泛型检查 [打印本页]

作者: a986875894    时间: 2014-11-17 23:48
标题: Java反射绕过泛型检查
今天才看反射,看到一道这样的题 感觉很有意思 分享一下
例如ArrayList<Integer> al = new ArrayList();
想在al集合中存储字符串类型,但是已经被泛型限制为integer类型, 可以通过反射机制绕过泛型检查,反射真的好强大
具体步骤,拿到.class字节码文件,拿到add方法记忆可以啦
具体代码实现:
  1. import java.lang.reflect.InvocationTargetException;
  2. import java.lang.reflect.Method;
  3. import java.util.*;
  4. class ClassDemo
  5. {
  6.         public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
  7.         {
  8.                 ArrayList<Integer> al = new ArrayList<Integer>();
  9.                 Class c = al.getClass();//有对象 所以直接获取class文件
  10.                 Method m = c.getMethod("add", Object.class);// 拿到add方法,明确存入的是Obj类型的数据
  11.                 m.invoke(al, "Hello");//存储运行
  12.                 m.invoke(al, "java");
  13.                 System.out.println(al);//打印结果为HelloWorld
  14.                
  15.         }
  16. }
复制代码

这道题据说还是面试题  大神别喷 不会的兄弟看看
作者: 夏至落叶    时间: 2014-11-17 23:50
受教了  1103班的兄弟一起加油,
作者: ls61532529    时间: 2014-11-17 23:51
这个方法真心不错,我用过后都感觉任督二脉口开了,好涨知识啊
作者: NCry    时间: 2014-11-17 23:52
这个我知道。看了张孝祥老师讲的。因为泛型只在编译的时候有用。在运行的时候是不带泛型的。所以,这个很好玩的。能这样搞!!!
作者: a986875894    时间: 2014-11-17 23:55
ls61532529 发表于 2014-11-17 23:51
这个方法真心不错,我用过后都感觉任督二脉口开了,好涨知识啊

我认得你  你是不是把 eclipse写错了内个小伙子




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2