如果要拷贝一个对象,大多数会想到clone()方法,那么使用clone()方法拷贝对象有哪些缺陷呐?
1.需要继承 java.lang.Cloneable 接口
2.手动完成clone()方法的覆盖,列如
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
那么很多时候我们只需要单纯拷贝属性,我们可以构造一个工具方法,如下
//访问权限的判断
public static boolean canControlMemberAccessible() {
try {
SecurityManager securityManager = System.getSecurityManager();
if (null != securityManager) {//有安全管理器时
securityManager.checkPermission(new ReflectPermission("suppressAccessChecks"));
}
} catch (SecurityException e) {
return false;
}
return true;
}
/**
* 实体对象的拷贝
* @param type 要拷贝的类型
* @param sourceBean 源对象实体
* @param destinationBean 目标对象实体
*/
public static void copyBeanProperties(Class<?> type, Object sourceBean,Object destinationBean) {
Class<?> parent = type;
while (parent != null) {
final Field[] fields = parent.getDeclaredFields();
for (Field field : fields) {
try {
try {
field.set(destinationBean, field.get(sourceBean));
} catch (IllegalAccessException e) {
if (canControlMemberAccessible()) {
field.setAccessible(true);
field.set(destinationBean, field.get(sourceBean));
} else {
throw e;
}
}
} catch (Exception e) {
}
}//拷贝父级属性
parent = parent.getSuperclass();
}
}
以上代码参考自mybatis