Java自定义Bean实体类对象转为Map类型对象

可以封装为Java的工具类

Posted by Steven on 2020-06-28

一、引入

接入一些接口的时候常常要把Bean实体类转化成Map对象,但事在使用不同的方法的时候会有不同结果,所以在这里记录下,方便以后用到

二、实现

(1)、使用反射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

public static HashMap<String, String> convertToMap(AtourBaseRequest obj)
throws Exception {
HashMap<String, String> map = new HashMap<String, String>();
Field[] fields = obj.getClass().getDeclaredFields();
for (int i = 0, len = fields.length; i &lt; len; i++) {
String varName = fields[i].getName();
boolean accessFlag = fields[i].isAccessible();
fields[i].setAccessible(true);
Object o = fields[i].get(obj);
if (o != null)
map.put(varName, o.toString());
fields[i].setAccessible(accessFlag);
}
return map;
}

但是上面的写法是有个问题,问题在于这段代码:

1
Field[] fields = obj.getClass().getDeclaredFields();

以上是获取类的字段

关于获取类的字段有两种方式

getFields()getDeclaredFields()
先看看这两者的区别吧:

  • getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
  • getDeclaredFields()
    获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。

同样类似的还有getConstructors()getDeclaredConstructors()getMethods()和getDeclaredMethods()
,这两者分别表示获取某个类的方法、构造函数

按照上面的写法,如果我们的bean类如果是有继承的父类,并且我们一般写实体类的字段都是私有的,那么父类中的字段我们就拿不到

(2)、使用BeanMap

通过 net.sf.cglib.beans.BeanMap 类中的方法,这种方式效率极高,因为它使用了缓存,初次创建bean时需要初始化,之后就使用缓存,所以速度极快,经测试,循环bean和map的转换10000次,仅需要300毫秒左右

1
2
3
4
5
6
7
8
9
private static <T> Map<String, Object> beanToMap(T bean) {
Map<String, Object> map = Maps.newHashMap();
if (bean != null) {
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
map.put(key + "", beanMap.get(key));
}
}
return map;

以上。