背景
反射其实使用上镜率不高,但是有些功能如果用反射来写会更通用。当然考量用不用为此写一个工具还是依据三次原则,即一样类似的代码如果写了3次以上,那就要考虑抽象一下了。比如这次有个需求是做报表生成excel下载,每次手动生成excel写起来很是麻烦,于是就写了个反射专门处理。用一个对象的属性作为excel的列名,一个对象就是一行。这样直接使用查询出的List转换一下就可以生成excel下载了,很是方便。
当然本文并不是写这个生成excel的工具,而是一个更基本的工具。关于反射的基本知识就不写了,浪费篇幅。
原因
为什么要写这个工具,就不得不说一下java.lang.reflect 包下的2个方法:
- getField
- getDeclaredField
第一个,getField方法 这个可以拿到该类 以及 父类中 所有 public 的属性 ,但是其他作用域(private,protect等)的属性拿不到。而第二个,getDeclaredField则可以获得 该类所有作用域的属性,但是无法从父类、超类等 中获得属性。
由于这2个方法都有局限性:比如我要拿到 一个类包括其继承的父类的 所有作用域的属性,这就尴尬了。而写这个工具类就是解决这个问题。
util
主要是用了递归向上查询获取,Object.class 作为返回标记。写的时候用到了lambda,所以得用java8。
1 | import java.lang.reflect.Field; |
结尾
主要还是上面的util代码,就几个递归也没啥好说的。希望能帮到有需要的人吧。