使用反射实现类的拷贝
程序员文章站
2022-05-28 18:03:09
...
public class Customer { private Long id; private String name; private int age; public Customer(){} /** * @return 返回 id */ public Long getId() { return id; } /** * @param 对id进行赋值 */ public void setId(Long id) { this.id = id; } /** * @return 返回 name */ public String getName() { return name; } /** * @param 对name进行赋值 */ public void setName(String name) { this.name = name; } /** * @return 返回 age */ public int getAge() { return age; } /** * @param 对age进行赋值 */ public void setAge(int age) { this.age = age; } }
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectTester { /** * @Title: copy * @Description: 根据指定的方法的参数去 构造一个新的对象的拷贝 * @param obj 要拷贝的对象 * @return * @author */ @SuppressWarnings("rawtypes") public Object copy(Object obj) { if (null == obj) { return null; } // 获得对象的类型 Class classType = obj.getClass(); System.out .println("the type of " + obj + " is " + classType.toString()); Object objectCopy = null; try { /* * 通过默认构造方法去创建一个新的对象, * getConstructor的视其参数决定调用哪个构造方法 */ objectCopy = classType.getConstructor(new Class[] {}).newInstance( new Object[] {}); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } try { // 获得对象的所有属性 Field[] fields = classType.getDeclaredFields(); for (Field field : fields) { // 属性名称 String fieldName = field.getName(); String stringLetter = fieldName.substring(0, 1).toUpperCase(); // 获得相应属性的getXXX和setXXX方法名称 String getName = "get".concat(stringLetter).concat( fieldName.substring(1)); String setName = "set".concat(stringLetter).concat( fieldName.substring(1)); // 获取相应的方法 Method getMethod = classType.getMethod(getName, new Class[] {}); Method setMethod = classType.getMethod(setName, new Class[] { field.getType() }); // 调用源对象的getXXX()方法 Object value = getMethod.invoke(obj, new Object[] {}); // 调用拷贝对象的setXXX()方法 setMethod.invoke(objectCopy, new Object[] { value }); } } catch (NoSuchMethodException ex) { ex.printStackTrace(); } catch (SecurityException ex) { ex.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } return objectCopy; } }
测试类:
public class Test { /** * @Title: main * @Description: TODO * @param args * @author wenjianhai */ public static void main(String[] args) { Customer customer = new Customer(); customer.setAge(20); customer.setId(1L); customer.setName("test"); // 拷贝后的新对象 Customer customer2 = (Customer) new ReflectTester().copy(customer); System.out.println("id\tname\tage"); if (null != customer2) { System.out.println(customer2.getId() + "\t" + customer2.getName() + "\t" + customer2.getAge()); } System.out.println("customer=" + customer); System.out.println("customer2=" + customer2); } }
测试结果:
the type of com.java.reflect.test1.Customer@d9f9c3 is class com.java.reflect.test1.Customer id name age 1 test 20 customer=com.java.reflect.test1.Customer@d9f9c3 customer2=com.java.reflect.test1.Customer@1a46e30
推荐阅读
-
ajax返回的json内容进行排序使用sort()方法实现
-
JavaScript使用indexOf()实现数组去重的方法分析
-
[PHP]移动端网页如何使用JqueryMobile+PHP实现上传图片的功能
-
[PHP]移动端网页如何使用JqueryMobile+PHP实现上传图片的功能
-
使用html2canvas.js实现页面截图并显示或上传的示例代码
-
ES6使用let命令更简单的实现块级作用域实例分析
-
python基础(13):函数名的使用、第一类对象、闭包、迭代器
-
PHP实现整个目录的拷贝功能
-
PHP实现的购物车类实例,php车类实例_PHP教程
-
对于Java中常使用的注解,你都是是怎么实现的?