关于 bean to map 反射调优
青苗 | 238 |
2022-09-15
bean2map 正常反射写法:
public static Map<String, Object> beanToMap(Object object) {
Map map = new HashMap<String, Object>();
try {
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
map.put(field.getName(), field.get(object));
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
这里性能影响最大的是 Field 的反射获取,优化改进为:
static Map<Class, List<Field>> clsFiles = new ConcurrentHashMap<>();
public static Map<String, Object> beanToMap1(Object object) {
Class cls = object.getClass();
List<Field> fields = clsFiles.get(cls);
if (null == fields) {
fields = Arrays.stream(cls.getDeclaredFields()).map(t -> {
t.setAccessible(true);
return t;
}).collect(Collectors.toList());
clsFiles.put(cls, fields);
}
Map map = new HashMap<String, Object>();
try {
for (Field field : fields) {
map.put(field.getName(), field.get(object));
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
我们把 Field 及 class 的关于反射保存,下面用 JMH 测试下:
static QcrudData qcrudData;
static {
qcrudData = new QcrudData();
qcrudData.setId(1L);
qcrudData.setValue1(1);
qcrudData.setValue2(2);
qcrudData.setValue3(3);
qcrudData.setValue4(4);
qcrudData.setValue5(5);
qcrudData.setValue5(6);
qcrudData.setValue7(7);
qcrudData.setValue8(8);
qcrudData.setValue9(9);
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(Test.class.getSimpleName())
.forks(1)
.build();
new Runner(opt).run();
}
@Benchmark
public void run1() {
beanToMap1(qcrudData);
}
@Benchmark
public void run2() {
beanToMap(qcrudData);
}
测试结果:
Benchmark Mode Cnt Score Error Units
Test.run1 thrpt 5 4631988.140 ± 2366381.030 ops/s
Test.run2 thrpt 5 3092690.819 ± 109364.220 ops/s
总体上性能提升近一倍 ORM 开发的时候可以合理的缓存字段 Field 实体 Class 的映射关系。
推荐指数:
真诚点赞 诚不我欺~