总结对象属性拷贝的方法及效率比较(一)代码

public class HotelCtrip {

    private int hotelId;
    private String hotelName;
    private Room room;

    public HotelCtrip(){}
    public HotelCtrip(int hotelId, String hotelName, Room room){
        this.hotelId = hotelId;
        this.hotelName = hotelName;
        this.room = room;
    }
}

public class HotelElong {

    private int hotelId;
    private String hotelName;
    private Room room;
    private String self2;

    public HotelElong(){}
    public HotelElong(int hotelId, String hotelName, Room roomElong){
        this.hotelId = hotelId;
        this.hotelName = hotelName;
        this.room = roomElong;
    }
}

public class Room {
    private int roomId;
    private String roomName;


    public Room(){}
    public Room(int roomId, String roomName){
        this.roomId = roomId;
        this.roomName = roomName;
    }
}

/**
 * 属性拷贝抽象类
 * Created by sjzylc on 18-7-25 025.
 */
public abstract class AbstractCopyService {

    /**
     * 计算多次执行的时间
     * @param dest
     * @param orig
     * @param loopTimes
     */
    public void calcExecTime(final Object dest, final Object orig, int loopTimes){
        long begin = System.currentTimeMillis();
        try {
            for(int i=0;i<loopTimes;i++) {
                copy(dest, orig);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        long time = System.currentTimeMillis()-begin;
        System.out.println("执行时间(ms):"+time+", "+this.getClass().getSimpleName());
    }

    /**
     * 抽象对象属性拷贝方法
     * @param dest
     * @param orig
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public abstract void copy(final Object dest, final Object orig) throws InvocationTargetException, IllegalAccessException;
}

/**
 * Apache的对象拷贝方法
 * Created by sjzylc on 18-7-25 025.
 */
public class ApacheBeanUtilsCopyService extends AbstractCopyService {
    @Override
    public void copy(Object dest, Object orig) throws InvocationTargetException, IllegalAccessException {
        BeanUtils.copyProperties(dest, orig);
    }
}
/**
 * Cglib的对象属性拷贝方法
 * Created by sjzylc on 18-7-25 025.
 */
public class CglibBeanCopyService extends AbstractCopyService {
    @Override
    public void copy(Object dest, Object orig) {
        BeanCopier beanCopier = BeanCopier.create(orig.getClass(), dest.getClass(), false);
        beanCopier.copy(orig, dest, null);
    }
}
/**
 * 自己写的get set方法进行复制拷贝
 * Created by sjzylc on 18-7-25 025.
 */
public class SelfGetSetCopyService extends AbstractCopyService {
    @Override
    public void copy(Object dest1, Object orig1) {
        HotelCtrip dest = (HotelCtrip) dest1;
        HotelElong orig = (HotelElong) orig1;
        dest.setHotelId(orig.getHotelId());
        dest.setHotelName(orig.getHotelName());
        Room room = new Room();
        room.setRoomId(orig.getRoom().getRoomId());
        room.setRoomName(orig.getRoom().getRoomName());
        dest.setRoom(room);
    }
}
/**
 * 自己通过反射进行的复制粘贴
 * Created by sjzylc on 18-7-25 025.
 */
public class SelfReflectCopyService extends AbstractCopyService {
    static Map<Class, Method[]> methodArrMap = new HashMap<>();
    @Override
    public void copy(Object dest, Object orig) throws InvocationTargetException, IllegalAccessException {
        Method[] destMethods = getMethods(dest),
                origMethods = getMethods(orig);
        Map<String, Method> methodMap = new HashMap<>();
        for(Method m: origMethods){
            if(m.getName().startsWith("set")){
                continue;
            }
            methodMap.put(m.getName(), m);
        }
        for(Method m: destMethods){
            if(m.getName().startsWith("get")){
                continue;
            }
            Method method = methodMap.get(m.getName().replaceAll("set","get"));
            Object value = method.invoke(orig);
            m.invoke(dest, value);
        }
    }
    private static Method[] getMethods(Object obj){
        Method[] methods = methodArrMap.get(obj.getClass());
        if(null==methods) {
            methods = obj.getClass().getDeclaredMethods();
            methodArrMap.put(obj.getClass(), methods);
        }
        return methods;
    }
}
/**
 * Spring的对象属性拷贝方法
 * Created by sjzylc on 18-7-25 025.
 */
public class SpringBeanUtilsCopyService extends AbstractCopyService {
    @Override
    public void copy(Object dest, Object orig) {
        org.springframework.beans.BeanUtils.copyProperties(orig, dest);
    }
}

public class Test3 {
    public static void main(String[] args) {
        Room room = new Room(1, "Standard Room");
        HotelElong hotelElong = new HotelElong(10001, "BeijingHotel", room);
        hotelElong.setSelf2("abc");
        HotelCtrip hotelCtrip = new HotelCtrip();
        int times = 10000;
        List<AbstractCopyService> abstractCopyServiceList =
                Arrays.asList(new ApacheBeanUtilsCopyService(),
                        new SelfReflectCopyService(),
                        new SpringBeanUtilsCopyService(),
                        new CglibBeanCopyService(),
                        new SelfGetSetCopyService());
        for(AbstractCopyService copyService : abstractCopyServiceList){
            copyService.calcExecTime(hotelCtrip, hotelElong, times);
            //System.out.println(JSONObject.toJSONString(hotelCtrip));
            //System.out.println("=====================================================================================");
        }
    }

}
发布了57 篇原创文章 · 获赞 39 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/SJZYLC/article/details/81203392
今日推荐