/**
- 通过反射机制实现任意对象的拷贝
- @author lx
/
public class CopyDemo {
/*
* 可以实现任意对象的拷贝返回的是object
*
* @param source
* @return
*/
@SuppressWarnings({ “unchecked”, “rawtypes” })
public static Object clone(Object source) {
Object target = null;
// 获取原对象的Class对象
try {
Class clz = source.getClass();
target = clz.newInstance();
// 获取目标对象对应的类中的所有属性
Field[] fields = clz.getDeclaredFields();
// 遍历所有的属性
for (Field f : fields) {
System.out.println(f.getName());
// 获得每一个属性的名称
String fname = f.getName();
// 分别获取属性的setter/ getter方法名称
String sname = “set” + fname.substring(0, 1).toUpperCase() + fname.substring(1);
String gname = “get” + fname.substring(0, 1).toUpperCase() + fname.substring(1);
// 如果属性是boolean类型的则需要get方法改成is
System.out.println(f.getType());
if (“boolean”.equals(f.getType().getCanonicalName())) {
gname = “is” + fname.substring(0, 1).toUpperCase() + fname.substring(1);
}
System.out.println(sname);
System.out.println(gname);
// 根据方法名以及属性类型获取方法对象
Method methodSet = clz.getMethod(sname, f.getType());
Method methodGet = clz.getMethod(gname);
// 执行原对象的get方法获取返回值 d.getxxx();
Object returnVal = methodGet.invoke(source);
// 执行目标对象的set方法完成属性值的赋值target.setxxx();
methodSet.invoke(target, returnVal);
}
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return target;
}
/**
* 实现任意对象的拷贝 返回的是对象本身
*
* @param <T>
* @param source
* @param t
*/
public static <T> T Clone(Object source, Class<T> t) {
T obj = null;
try {
// 基于目标类型实例化一个对象
obj = t.newInstance();
Field[] fields = t.getDeclaredFields();
for (Field f : fields) {
System.out.println(f);
// 获得每一个属性的名称
String fname = f.getName();
// 分别获取属性的setter/ getter方法名称
String sname = "set" + fname.substring(0, 1).toUpperCase() + fname.substring(1);
String gname = "get" + fname.substring(0, 1).toUpperCase() + fname.substring(1);
// 如果属性是boolean类型的则需要get方法改成is
System.out.println(f.getType());
if ("boolean".equals(f.getType().getCanonicalName())) {
gname = "is" + fname.substring(0, 1).toUpperCase() + fname.substring(1);
}
// 根据方法名以及属性类型获取方法对象
Method methodSet = t.getMethod(sname, f.getType());
Method methodGet = t.getMethod(gname);
methodSet.invoke(obj, methodGet.invoke(source));
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return obj;
}
public static void main(String[] args) {
Dog d = new Dog();
d.setId(1);
d.setName("旺财");
d.setAge(5);
d.setType("二哈");
// 拷贝
// Object d2 = CopyDemo.clone(d);
// System.out.println(d2);
Dog dog = CopyDemo.Clone(d, Dog.class);
System.out.println(dog);
}
}