利用反射进行对象拷贝的例子

如下例程ReflectTester类进一步演示了Reflection API的基本使用方法。

ReflectTester类有一个copy(Object object)方法,这个方法能够创建一个和参数object同样类型的对象,然后把object对象中的所有属性拷贝到新建的对象中,并将它返回。

这个例子只能复制简单的类,假定类的每个属性都有public类型的getXXX()和setXXX()方法。

  

  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4.  
  5. public class ReflectTester
  6. {
  7.  
  8. // 该方法实现对Customer对象的拷贝操作
  9. public Object copy(Object object) throws Exception
  10. {
  11. Class<?> classType = object.getClass();
  12.  
  13. /* 生成新的对象的讨论
  14. // 获得Constructor对象,此处获取第一个无参数的构造方法的
  15. Constructor cons = classType.getConstructor(new Class[] {});//不带参数,所以传入一个为空的数组
  16. // 通过构造方法来生成一个对象
  17. Object obj = cons.newInstance(new Object[] {});
  18.  
  19. // 以上两行代码等价于:
  20. Object obj11 = classType.newInstance(); // 这行代码无法处理构造函数有参数的情况
  21.  
  22. //用第二个带参数的构造方法生成对象
  23. Constructor cons2 = classType.getConstructor(new Class[] {String.class, int.class});
  24. Object obj2 = cons2.newInstance(new Object[] {"ZhangSan",20});
  25.  
  26. */
  27.  
  28. Object objectCopy = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
  29.  
  30. //获得对象的所有成员变量
  31. Field[] fields = classType.getDeclaredFields();
  32. for(Field field : fields)
  33. {
  34. //获取成员变量的名字
  35. String name = field.getName(); //获取成员变量的名字,此处为id,name,age
  36. //System.out.println(name);
  37.  
  38. //获取get和set方法的名字
  39. String firstLetter = name.substring(0,1).toUpperCase(); //将属性的首字母转换为大写
  40. String getMethodName = "get" + firstLetter + name.substring(1);
  41. String setMethodName = "set" + firstLetter + name.substring(1);
  42. //System.out.println(getMethodName + "," + setMethodName);
  43.  
  44. //获取方法对象
  45. Method getMethod = classType.getMethod(getMethodName, new Class[]{});
  46. Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()});//注意set方法需要传入参数类型
  47.  
  48. //调用get方法获取旧的对象的值
  49. Object value = getMethod.invoke(object, new Object[]{});
  50. //调用set方法将这个值复制到新的对象中去
  51. setMethod.invoke(objectCopy, new Object[]{value});
  52.  
  53. }
  54.  
  55. return objectCopy;
  56.  
  57. }
  58.  
  59. public static void main(String[] args) throws Exception
  60. {
  61. Customer customer = new Customer("Tom",20);
  62. customer.setId(1L);
  63. ReflectTester tester = new ReflectTester();
  64.  
  65. Customer customer2 = (Customer)tester.copy(customer);
  66.  
  67. System.out.println(customer2.getId() + "," + customer2.getName() + "," + customer2.getAge());
  68.  
  69. }
  70. }
  71.  
  72. class Customer
  73. {
  74. private long id;
  75. private String name;
  76. private int age;
  77.  
  78. public Customer()
  79. {
  80. }
  81.  
  82. public Customer(String name, int age)
  83. {
  84. this.name = name;
  85. this.age = age;
  86. }
  87.  
  88. public long getId()
  89. {
  90. return id;
  91. }
  92.  
  93. public void setId(long id)
  94. {
  95. this.id = id;
  96. }
  97.  
  98. public String getName()
  99. {
  100. return name;
  101. }
  102.  
  103. public void setName(String name)
  104. {
  105. this.name = name;
  106. }
  107.  
  108. public int getAge()
  109. {
  110. return age;
  111. }
  112.  
  113. public void setAge(int age)
  114. {
  115. this.age = age;
  116. }
  117. }
 

参考资料:

http://www.cnblogs.com/mengdd/archive/2013/01/26/2878136.html

http://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html

http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html

http://www.cnblogs.com/octobershiner/archive/2012/03/18/2404751.html

Java反射学习二的更多相关文章

  1. Java反射学习系列-绪论

    Java反射学习系列-绪论 https://blog.csdn.net/hanchao5272/article/details/79358924

  2. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...

  3. Java反射学习总结四(动态代理使用实例和内部原理解析)

    通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加 ...

  4. Java开发学习(二十二)----Spring事务属性、事务传播行为

    一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...

  5. Java开发学习(二十四)----SpringMVC设置请求映射路径

    一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...

  6. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  7. Java开发学习(二十六)----SpringMVC返回响应结果

    SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...

  8. Java开发学习(二十七)----SpringMVC之Rest风格解析及快速开发

    一.REST简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描 ...

  9. Java开发学习(二十八)----拦截器(Interceptor)详细解析

    一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...

随机推荐

  1. Form表单中Post与Get方法的区别

    Form提供了两种数据传输的方式:get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响. Form中的get和post方法,在数据传输过程中分别 ...

  2. 序列化模块1 json

    ......得到一个 字符串 的结果 过程就叫序列化 字典 / 列表 / 数字 /对象 -序列化->字符串 为什么要序列化 # 1.要把内容写入文件 序列化 # 2.网络传输数据 序列化 字符串 ...

  3. css points

    <style type="text/css" rel="stylesheet">.a{ width:500px; height:400px;对放置图 ...

  4. svn 同步资源库时忽略某些文件类型和文件夹

    项目开发中,开发人员经常用SVN来管理代码,在和服务器同步时,每次都看到一堆.class,.log,target等文件,这样很不舒服. 解决方法: 打开:window-->preferences ...

  5. Oracle EBS PO退货失败

    无法读取例程 &ROUTINE 中配置文件选项 INV_DEBUG_TRACE 的值. 系统-配置文件-地点层 INC%调试%踪 是 select *  from po_interface_e ...

  6. Oracle EBS PO 接受入库

  7. CentOS随笔 - 5.CentOS7安装Sql Server 2017

    前言 转帖请注明出处: http://www.cnblogs.com/Troy-Lv5/ 开发环境嘛, 作为.Net系Sql Server那是必备的. 听过Sql server可以安装在Linux上了 ...

  8. [微信] 客服接口调用的时候返回 40003 Invalid OpenID

    首先确认收件人在24小时内主动向公众号发过消息.该消息的 FromUserId 即是客服消息的 touser 参数的 OpenId 2017-05-19 更新:可以使用UTF-8了 string ur ...

  9. 设计标签选择器TitleSwitch

    设计标签选择器TitleSwitch 效果如下: 源码如下: TitleSwitch.h 与 TitleSwitch.m // // TitleSwitch.h // TitleSwitch // / ...

  10. [翻译] NMBottomTabBarController

    NMBottomTabBarController A customisable tab bar controller for iOS written in Objective C. It uses a ...