java反射调用get/set方法,你还在拼接方法名吗?
  TEZNKK3IfmPf 19天前 20 0

前言

最新工作中,遇到了通过反射调用get/set方法的地方,虽然反射的性能不是很好,但是相比较于硬编码的不易扩展,getDeclareFields可以拿到所有的成员变量,后续添加或删除成员变量时,不用修改代码,且应用次数只在修改数据时使用,故牺牲一些性能提高扩展性

传统的方式

见过很多人通过反射调用get/set方法都是通过获取属性的name,然后通过字符串截取将首字母大写,再拼上get/set来做

 

还有稍微好一点的同学,通过fieldName转成字符数组,首个字符-32来避免字符串截取的

 

诚然,我觉得两种方式都可以,但是不知道有没有遇到过,生成的get/set方法并不是已get/set开头的,而是以is开头的,比如boolean类型的成员变量。这个时候我们就需要去判断属性的类型,然后用不同的前缀来拼接get/set方法名。其实,在jdk中已经包含了这样的工具类

Introspector和PropertyDescriptor

关于这两个类的详细介绍,我这里就不说了,简单的理解就是对象信息的描述,里面提供了一些API方便我们拿到对象的信息

 

PropertyDescriptor类提供了getReadMethod和getWriteMethod,其实就是对于get/set方法,至于方法名称不需要我们来关于,这样就可以避免方法名拼错的情况了。

另外PropertyDescriptor除了可以通过Introspector获取,也可以自己new来创建,其构造方法还是比较全的

java反射调用get/set方法,你还在拼接方法名吗?

通常传递一个属性的名称和类对象class就可以了

 
 
 

通过上面两种不同的实现方式可以看到,Introspector会额外有一个class属性,但是类似serialVersionUID不会算在内;而自定义PropertyDescriptor需要通过反射拿到所有的属性,虽然不会有class属性,但是serialVersionUID会算在内,使用的时候需要注意一下。

如果你以为这就是Introspector的全部功能,那就大错特错了。Introspector不同于普通的反射,反射一次,一段时间内可重复使用,为什么不是永久呢,看下源码java反射调用get/set方法,你还在拼接方法名吗?

 

注意中间加粗标红的代码,这里除了同步之外,还做了一个本地的缓存

 

这个beanInfoCache 其实是一个WeakHashMap,每次gc被回收,所以上面说一段时间内可以重复使用而不是永久,也是为了避免OOM吧

总结

大概先说这么多吧,虽然算不上什么高级技术,但是能将工作中遇到的小问题解决也是成长啊!

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 19天前 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2023年11月14日   39   0   0 反射go
  TEZNKK3IfmPf   2024年03月29日   107   0   0 反射java
  TEZNKK3IfmPf   2024年04月26日   48   0   0 反射
  TEZNKK3IfmPf   2023年11月14日   27   0   0 shellSet
  TEZNKK3IfmPf   2023年11月13日   73   0   0 反射构造器
  TEZNKK3IfmPf   2023年11月14日   42   0   0 反射
TEZNKK3IfmPf