reflectasm的FieldAccess的get方法跟Field的get方法的性能比较

一千万条数据的比较,基本上没有大的差别,但是FieldAccess的get方法需要对象的属性为public,破坏了封装性,所以不太建议用此方法

package com.example.demo;

import cn.hutool.core.util.ReflectUtil;
import com.esotericsoftware.reflectasm.FieldAccess;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Date: 2025/12/26/11:00
 * @Description:
 */
public class FieldAccessPerformanceTest {

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setHight(22);
        dog.setName("bb");
        Dog dog1 = new Dog();
        dog1.setHight(33);
        dog1.setName("cc");
        List<String> list = new ArrayList<>();
        list.add("name");
        list.add("hight");
        long l = System.currentTimeMillis();
        for(int i =0; i < 10000000; i++ ){
            fileAccess(dog,dog1,Dog.class,list);
        }
        long l2 = System.currentTimeMillis();
        System.out.println(l2-l);

        long l3 = System.currentTimeMillis();
        for(int i =0; i < 10000000; i++ ){
            compareFields(dog,dog1,Dog.class,list);
        }
        long l4 = System.currentTimeMillis();
        System.out.println(l4-l3);

        long l5 = System.currentTimeMillis();
        for(int i =0; i < 10000000; i++ ){
            fileAccess(dog,dog1,list);
        }
        long l6 = System.currentTimeMillis();
        System.out.println(l6-l5);

    }



    static void fileAccess(Dog dog, Dog dog1, List<String> list) {
        Map<String, String> map = list.stream().collect(Collectors.toMap(e -> e, e -> e));
        FieldAccess fieldAccess = FieldAccess.get(Dog.class);
        map.forEach((k, v) -> {
            Object o = fieldAccess.get(dog, k);
            Object o1 = fieldAccess.get(dog1, k);
            if (o.equals(o1)) {

            }
        });
    }

    static Map<Class,FieldAccess> cacheFieldAccess = new HashMap<>();


    static FieldAccess getFieldAccess1(Class clzz){
        return cacheFieldAccess.computeIfAbsent(clzz,e-> FieldAccess.get(clzz));
    }


    static void fileAccess(Dog dog, Dog dog1, Class clzz, List<String> list) {
        FieldAccess fieldAccess = getFieldAccess1(clzz);
        fileAccess(dog,dog1,fieldAccess,list);
    }


    static void fileAccess(Dog dog, Dog dog1,FieldAccess fieldAccess, List<String> list) {
        Map<String, String> map = list.stream().collect(Collectors.toMap(e -> e, e -> e));
        map.forEach((k, v) -> {
            Object o = fieldAccess.get(dog, k);
            Object o1 = fieldAccess.get(dog1, k);
            if (o.equals(o1)) {

            }
        });
    }

    static void compareFields(Dog dog, Dog dog1, Class clzz, List<String> list) {
        Map<String, String> map = list.stream().collect(Collectors.toMap(e -> e, e -> e));
        Field[] fields = ReflectUtil.getFields(clzz);
        for (Field field : fields) {
            if (map.get(field.getName()) != null) {
                Object fieldValue = ReflectUtil.getFieldValue(dog, field);
                Object fieldValue1 = ReflectUtil.getFieldValue(dog1, field);
                if(fieldValue.equals(fieldValue1)){

                }
            }
        }
    }


}

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容