本帖最后由 qianji20000420 于 2017-8-6 16:33 编辑

导读

  • 如何利用反射绕过泛型检查

泛型

  • 什么是泛型?
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。(来自度娘百科) 这节课不讲泛型,想知道泛型的翻翻本版的其他教程。

如何利用反射绕过泛型检查

我们先写一个这样的代码
  1. public class Demo_01 {
  2.         public static void main(String[] args){
  3.                 ArrayList<Integer> array = new ArrayList<Integer>();
  4.                 array.add(3);
  5.                
  6.         }
  7. }
复制代码
这当然是能够正常运行了
但是如果下面我又写一个这个呢?
  1. array.add("eee");
复制代码
程序就无法正常的编译了。
但是我们想,事实上泛型的在运行时全都是Object类型 那我们何尝不可以用Object类型来获取?
  1. Class<?> c = array.getClass();
  2. Method m = c.getMethod("add", Object.class);
复制代码
然后用m来调用invoke方法,然后输出array
  1. m.invoke(array, "ccc");
  2. System.out.println(array);
复制代码

那在没学反射之前的你会想到Integer的ArrayList可以加入String的元素吗?


下一篇

反射在Bukkit插件编写中的运用
返回索引贴
第一次做教程,如果教程中有遗漏的或说错的地方请及时指出哇。~
感谢 @splt 大佬指出的错误,原文有错误的地方已改正


[groupid=1181]Unknown Domain[/groupid]