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("=====================================================================================");
}
}
}
总结对象属性拷贝的方法及效率比较(一)代码
猜你喜欢
转载自blog.csdn.net/SJZYLC/article/details/81203392
今日推荐
周排行