最近开发中遇到这样一个问题将父类的属性值copy到子类中,从而对子类添加一些其他属性。

父类:

  1. package com.jalja.org.jms.test01;
  2.  
  3. import java.util.Date;
  4.  
  5. public class User {
  6. private Integer id;
  7. private String name;
  8. private Date time;
  9. public User() {
  10. super();
  11. }
  12. public User(String name, Date time) {
  13. super();
  14. this.name = name;
  15. this.time = time;
  16. }
  17. public User(Integer id, String name, Date time) {
  18. super();
  19. this.id = id;
  20. this.name = name;
  21. this.time = time;
  22. }
  23. public Integer getId() {
  24. return id;
  25. }
  26. public void setId(Integer id) {
  27. this.id = id;
  28. }
  29. public String getName() {
  30. return name;
  31. }
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35. public Date getTime() {
  36. return time;
  37. }
  38. public void setTime(Date time) {
  39. this.time = time;
  40. }
  41. }

子类:

  1. package com.jalja.org.jms.test01;
  2.  
  3. public class UserVO extends User{
  4. private int sex;
  5. public int getSex() {
  6. return sex;
  7. }
  8. public void setSex(int sex) {
  9. this.sex = sex;
  10. }
  11. }
  1. package com.jalja.org.jms.test01;
  2.  
  3. import java.lang.reflect.Field;
  4. import java.util.Date;
  5.  
  6. public class CopyObj {
  7. /**
  8. * 我们的业务是需要在现有的类上扩展一些属性供视图层使用
  9. * 1、在原有类上扩展一些属性也可以实现,但这样需要在别人的代码中直接更改,个人认为不是很好。
  10. * 2、写一个扩展类 UserVO 继承原类 User
  11. * @param args
  12. * @throws IllegalArgumentException
  13. * @throws IllegalAccessException
  14. */
  15. public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
  16. User user=new User("2131",new Date());
  17. //将父类强转为子类出现异常Exception in thread "main" java.lang.ClassCastException:
  18. //UserVO vo1=(UserVO) user;
  19. //vo1.setSex(0);
  20.  
  21. UserVO vo2=(UserVO) copyObj(user,new UserVO());
  22. vo2.setSex(0);
  23. System.out.println(vo2.getName());
  24.  
  25. }
  26. /** 子对象copy父对象的属性值
  27. * copyObj 继承 targetObj
  28. * @param targetObj 被copy的目标对象
  29. * @param copyObj copy后的对象
  30. * @throws IllegalAccessException
  31. * @throws IllegalArgumentException
  32. */
  33. public static <T> T copyObj(T targetObj,T copyObj ) throws IllegalArgumentException, IllegalAccessException{
  34. Field [] fields=targetObj.getClass().getDeclaredFields();
  35. Field [] fieldsvo=copyObj.getClass().getSuperclass().getDeclaredFields();
  36. for(Field f:fields){
  37. f.setAccessible(true);
  38. for(Field f2:fieldsvo){
  39. f2.setAccessible(true);
  40. if(f.get(targetObj)!=null&& f.getName().toString().equals(f2.getName().toString())){
  41. f2.set(copyObj,f.get(targetObj)) ;
  42. }
  43. }
  44. }
  45. return copyObj;
  46. }
  47. }

父类属性值的copy的更多相关文章

  1. spring mvc 处理pojo传递对象时该对象继承父类的属性在网络接收端接收该属性值总是null,why?

    //=========================== 情形一: ===============================//在网络上传递User1类对象时info属性值在网络的另一端能够接 ...

  2. java反射获取和设置实体类的属性值 递归所有父类

    最近做一个通用数据操作接口,需要动态获取和设置实体类的属性值,为了通用实体做了多重继承,开始网上找到代码都不支持父类操作,只能自己搞一个工具类了,此工具类可以设置和获取所有父类属性,代码贴下面拿走不谢 ...

  3. iOS修改声明为readonly的属性值

    本文讨论的是,对于类中声明为 readonly 的属性值,我们就不可以修改其值了么?如何可以,那么如何修改呢? 为了便于说明,定义一个 ACLStudent 的类: ACLStudent.h @int ...

  4. Objective-C中变量采用@property的各个属性值的含义

    我们在OC中定义变量,可以自己来定义变量的setter方法来设置变量值,用getter方法来获取变量值.但是当变量数量增多时,还采用手动添加setter/getter方法来操作变量,就会使得程序代码量 ...

  5. 为啥NSString的属性要用copy而不用retain

    之前学习生活中,知道NSString的属性要用copy而不用retain,可是不知道为啥,这两天我研究了一下,然后最终明确了. 详细原因是由于用copy比用retain安全,当是NSString的时候 ...

  6. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  7. GDAL C#读取shp中文属性值乱码问题

    GDAL的C#版本读取shp中,如果属性值中含有中文,读出来有可能是乱码的问题,根据SWIG生成的C#代码调试发现问题所在,在Ogr.cs文件中有这么一个函数,代码如下: internal stati ...

  8. 将source类中的属性值赋给target类中对应的属性

    /** * 对象的属性值拷贝 * <p> * 将source对象中的属性值赋值到target对象中的属性,属性名一样,类型一样 * <p> * example: * <p ...

  9. 【java】之Method和Field反射获取和设置属性值

    package com.javaluna.reflect; import java.lang.reflect.Field; import java.lang.reflect.Method; impor ...

随机推荐

  1. HDU 5212 莫比乌斯反演

    Code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  2. 【HDOJ-1081】To The Max(动态规划)

    To the Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem ...

  3. java基础之while语句的练习

    计算1-100,7的倍数的数的总和 代码如下: public class Demo1 { public static void main(String[] args) { int num=1; int ...

  4. IOI 2017 Practice Contest mountains

    Mountains 题面 题意: 选最多的点使得两两看不见. 分析: 分治,solve(l,r)为区间[l,r]的答案.那么如果不选最高点,分治两边即可,选了最高点,那么在最高点看不见的区间里分治. ...

  5. netty之管道处理流程

    1.我们在使用netty的是有都会存在将channelBuffer的数据处理成相应的String或者自定义数据.而这里主要是介绍管道里面存在的上行和下行的数据处理方式 2.通过一张图片来看一下具体管道 ...

  6. CDN 缓存策略(转)

    1.CDN加速原理    通过动态域名解析,网友的请求被分配到离自己最快的服务器.CDN服务器直接返回缓存文件或通过专线代理原站的内容.    网络加速+内容缓存,有效提供访问速度 2.CDN节点数量 ...

  7. .NET邮件发送详情

    ①百度下载个Free Smtp Server ②下载完成后,打开进去,点击左上角的options,弹出窗口,进行如下图选项即可(一般默认已正确选中),然后我们可以把这软件关了. (下次你重启电脑时,也 ...

  8. git 从头开始

    下载安装git 打开git,输入以下命令,引号内的为你自己的名字和邮箱 git config --global user.name "Your Name"git config -- ...

  9. 子序列 (All in All,UVa10340)

    题目描述:算法竞赛入门经典习题3-9 题目思路:循环匹配 //没有按照原题的输入输出 #include <stdio.h> #include <string.h> #defin ...

  10. C#二次封装虹软arc研究

    相信很多用C#又想用虹软的SDK的童鞋要花很多心思去研究怎么转换,所以写了一篇文章和一个demo方便用C#的童鞋方便调用虹软的接口, 文章的地址是:https://blog.xgcos.com/sho ...