Java反射超越泛型

BeanUtils.copyProperties引发的血案

在一次使用BeanUtils.copyProperties的方法是,莫名其妙的报错,产生的代码分解如下:

  EntityA entityA = new EntityA();
  List<UniteA> uniteAList = new ArrayList<>();
  for (int i = 0; i < 10; i++) {
  	UniteA uniteA = new UniteA();
  	uniteA.setAge(i);
  	uniteA.setName("name" + i);
  	uniteAList.add(uniteA);
  }
  entityA.setKey(10);
  entityA.setUniteList(uniteAList);

把EntityA的值赋值给EntityB:

 EntityB entityB = new EntityB();
 BeanUtils.copyProperties(entityA, entityB);
 System.out.println(entityB.getUniteList().get(0).getClass());  

在运行这段代码的时候,发生了异常的信息:

对于这个异常,我观察了很久,在调试的时候发现,EntityA中的UniteA中的字段竟然能够赋值给 EntityB中UnitB中的字段!! 类型不一样,竟能够存储!!


泛型仅仅适用于编译期


对于这个问题,归根于java的泛型的特点,泛型仅仅适用于编译期,下面我们写几个代码来验证这个问题:

   List<String> strList=new ArrayList<>();
   strList.add("1234");//正常的编译
   strList.add(1234);//编译不能通过

上面的例子我们可以看到List的类型的集合无法直接添加一个整型数据,但这个仅仅在编译的才校验,我们可以是有反射绕过这个验证。

    List<String> strList=new ArrayList<>();
	strList.add("1234");//正常的编译
	try {
		Method method=strList.getClass().getDeclaredMethod("add",Object.class);
		method.invoke(strList,1234);
		System.out.println(strList);
	} catch (Exception e) {
		e.printStackTrace();
	}

调试信息如下:

同样,我们也可以使用如下代码验证上面的结论:

 List<String> strList=new ArrayList<>();
 List<Integer> intList=new ArrayList<>();
 System.out.println(strList.getClass().equals(intList.getClass()));

打印结果为:true

本文代码文件:下载

(本文完)

作者:老付 如果觉得对您有帮助,可以下方的订阅,或者选择右侧捐赠作者,如果有问题,请在捐赠后咨询,谢谢合作 如有任何知识产权、版权问题或理论错误,还请指正。 自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证 交流请加群113249828:点击加群 或发我邮件 laofu_online@163.com

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏撸码那些事

【封装那些事】 未利用封装

客户代码使用显式类型检查(使用一系列if-else或switch语句检查对象的类型),而不利用出层次结构内已封装的类型变化时,将导致这种坏味。

40990
来自专栏Leetcode名企之路

【Leetcode】65. 有效数字

例如: "0" => true " 0.1 " => true "abc" => false "1 a" => false "2e10" => true

14530
来自专栏Java技术栈

出场率比较高的一道多线程安全面试题

工作一两年的应该都知道 ArrayList 是线程不安全的,要使用线程安全的就使用 Vector,这也是各种 Java 面试宝典里面所提及的,可能很多工作好几年...

11040
来自专栏Java工程师日常干货

使用Google Guava快乐编程以面向对象思想处理字符串:Joiner/Splitter/CharMatcher对基本类型进行支持对JDK集合的有效补充函数式编程:Functions断言:Pred

目前Google Guava在实际应用中非常广泛,本篇博客将以博主对Guava使用的认识以及在项目中的经验来给大家分享!正如标题所言,学习使用Google Gu...

17930
来自专栏tkokof 的技术,小趣及杂念

Coroutine,你究竟干了什么?(小续)

前篇中讲了一些自己关于Coroutine的理解,后来陆陆续续的又想到了一些,在此简单记录一下,内容不多,故作“小”续吧 :)

9020
来自专栏JAVA高级架构开发

Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。

16430
来自专栏Jimoer

经历的面试题,先做下部分总结。

17230
来自专栏java一日一条

JAVA常见面试题及解答(精华)

这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存。

12220
来自专栏Java爬坑系列

类的进化史

  类无疑是C++最重要的概念之一,是从C的面向过程到C++面向对象的重要转变的基础,下面我们就来谈谈C++中的类是怎样演变的。   先来看看C中的结构体(st...

24850
来自专栏杨熹的专栏

【LEETCODE】模拟面试-294.Flip Game II

图:新生大学 You are playing the following Flip Game with your friend: Given a string...

37980

扫码关注云+社区

领取腾讯云代金券