美文网首页
java 反射学习笔记(三)通过反射机制,绕过编译时泛型检测

java 反射学习笔记(三)通过反射机制,绕过编译时泛型检测

作者: 夕决_ | 来源:发表于2019-11-17 20:17 被阅读0次

在日常编码过程中,我们定义一个List,通常会同是为list集合添加泛型,进行约束List<String>,保证我们在list.add()添加对象的时候,类型一致。

比如定义一个集合

public class ListDemo {
    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("abc");
        stringList.add(1);// 报错,无法通过编译
    }
}

再创建一个新的list集合

List<Integer> integerList = new ArrayList<>();

使用getClass()方法 获取stringListintegerList的类类型进行比较。

Class strListClass = stringList.getClass();
Class intListClass = integerList.getClass();
System.out.println(strListClass == intListClass);

打印结果:

true

也就是说类类型都是一致的。
编译之后的集合的泛型是去泛型化的。
java中集合的泛型,是防止错误输入,只在编译期有效,绕过编译就无效了。

那么我们只要绕过编译,就可以让这个泛型限制无效。
如何绕过编译呢?
反射的操作,都是编译后的操作,也就是运行时。

我们来验证一下,通过方法的反射来操作:

System.out.println(stringList);
        try {
            Method m = strListClass.getMethod("add",Object.class);
            // 绕过编译去操作,也就绕过了泛型检测
            m.invoke(stringList,1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("--------------");
        System.out.println(stringList);

打印结果:

[abc]
--------------
[abc, 1]

通过反射操作,将int类型的数字1 添加到了 List<String> stringList 集合中。

这里还有一个需要注意的地方,虽然通过反射绕过泛型检测将数值添加了进去,但在遍历是会报错的。

for (String s : stringList) {
            System.out.println(s);
        }

这里会抛异常(类型转换异常):

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

文章链接:
Java 反射学习笔记(一)认识Class
java 反射学习笔记(二)方法的反射
java 反射学习笔记(三)通过反射机制,绕过编译时泛型检测
java 反射学习笔记(四)反射的基本操作和用法

相关文章

  • java 反射学习笔记(三)通过反射机制,绕过编译时泛型检测

    在日常编码过程中,我们定义一个List,通常会同是为list集合添加泛型,进行约束List ,保证我们在list....

  • [JAVA学习笔记] 反射机制

    [JAVA学习笔记] 反射机制 Java的反射通过Class类和java.lang.reflect类库实现。通过它...

  • 2019-02-19 通过反射来看泛型的本质

    反射是在运行时编译后操作,而泛型是在编译时生效,泛型是为了防止错误的类型输入,在编译后泛型并不存在。当绕过编译用反...

  • Java 泛型学习总结

    前言 Java 5 添加了泛型,提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质...

  • 反射

    动态编译与静态编译 反射 一个注意的地方Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译到了运行...

  • 基础: 泛型

    引言 java泛型是JDK1.5中引入的一个新特性,泛型提供了编译时的类型检测机制,该机制允许程序员在编译时检测到...

  • java基础巩固-详解泛型

    java泛型(generics)为jdk5引入的新特性,泛型提供了编译时类型安全检测机制,可以在编译时检测到非法的...

  • Java反射——通过反射绕过集合泛型的限制​

    直接上代码: “去泛型化”就是指忽略了泛型在集合中的作用。在集合中泛型主要是来防止错误输入的,只在编译阶段有效,而...

  • Java 与 Kotlin 泛型

    Java Java 泛型(generics)是 JDK 5 中引入的一个新特性,泛型提供了编译时类型安全检测机制,...

  • 章节笔记——泛型与反射机制

    泛型 反射机制 泛型:由于类型转换错误,编译时不报错,运行时报错。为了弥补这个问题,用泛型弥补,集合类添加对象不需...

网友评论

      本文标题:java 反射学习笔记(三)通过反射机制,绕过编译时泛型检测

      本文链接:https://www.haomeiwen.com/subject/inhmictx.html