一千万条数据的比较,基本上没有大的差别,但是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