关于 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 的映射关系。

文章标签: Java
推荐指数:

真诚点赞 诚不我欺~

关于 bean to map 反射调优

点赞 收藏 评论

关于作者

青苗
青苗

青苗幼儿园园长

等级 LV5

粉丝 20

获赞 47

经验 1182