基于反射实现对象拷贝

/**

  • 通过反射机制实现任意对象的拷贝
  • @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);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值