利用反射实现类的复制
来源:互联网 发布:公章可以在淘宝上刻吗 编辑:程序博客网 时间:2024/06/11 03:40
利用反射实现类的复制
笔者年前在项目中遇到数据复制报错,根据排查,最终锁定问题出在类的复制上面。经过多种尝试,仍不行,遂放弃common.lang包中的办法,利用反射写个类复制的工具类。闲话不多说,直接上代码。
package com.xq.util;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * 类的拷贝 * @author wangweiqiang **/public class BeanProperties { public static void copy(Object target, Object source) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ Class sourceClass = source.getClass(); Class targetClass = target.getClass(); //获取类的所有属性 Field[] sourceFields = sourceClass.getDeclaredFields(); Field[] targetFields = targetClass.getDeclaredFields(); //双重循环 复制 for (Field sourceField : sourceFields) { String sourceFieldName = sourceField.getName(); Class sourceFieldType = sourceField.getType(); //拼写get方法名 String methodName = sourceFieldName.substring(0, 1).toUpperCase()+sourceFieldName.substring(1); Method getMethod = sourceClass.getMethod("get"+methodName); //反射获取属性值 Object value = getMethod.invoke(source); for (Field field : targetFields) { String targetFieldname = field.getName(); //判断目标属性的名字和类型 是否一致 if(targetFieldname.equals(sourceFieldName) && sourceFieldType.equals(field.getType())){ Method setMethod = targetClass.getMethod("set"+methodName, sourceFieldType); //invoke 执行set方法 setMethod.invoke(target, value); } } } }}
测试类
package com.xq.test;import java.lang.reflect.InvocationTargetException;import java.util.Date;import com.xq.entity.UserSource;import com.xq.entity.UserTarget;import com.xq.util.BeanProperties;/*** 测试类* @author Administrator**/public class BeanCopyDemo {public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { UserTarget target = new UserTarget(); UserSource source = new UserSource(); source.setAddress("水电费水电费"); source.setAge(18); source.setBirth(new Date()); source.setUserName("测试反射"); BeanProperties.copy(target, source); System.out.println("name:"+target.getUserName()); System.out.println("sex:"+target.getSex()); System.out.println("birth:"+target.getBirth()); System.out.println("address:"+target.getAddress()); }}
下面贴一下实体类
package com.xq.entity;import java.util.Date;public class UserTarget { private String userName; private String address; private String sex; private Date birth; public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; }}
测试结果:
name:测试反射sex:nullbirth:Sat Jan 07 00:31:06 CST 2017address:水电费水电费
在此感谢一位朋友,因为你的支持,以后我会坚持更新博客。
0 0
- 利用反射实现类的复制
- 用反射实现对象的拷贝 及 利用内省类实现对象的复制
- C#利用反射实现两个类的对象之间相同属性的值的复制
- 利用反射实现类的动态加载
- 利用反射实现类的动态加载
- 利用反射实现类的动态加载
- 利用反射实现类的动态加载
- 利用反射,实现类的封装
- C#利用反射复制实体类
- 利用反射复制数据
- java 学习笔记--利用反射实现泛型数组的复制
- Java利用反射实现对象之间相同属性复制
- Java -- 利用反射实现对象之间相同属性复制BeanUtil
- 利用反射实现泛型的实现
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- 利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils
- Linux下给自己的应用程序创建一个桌面启动图标
- SAP接口编程之 NCo3.0系列(05) : Table作为输入参数
- 乡下回忆:王子臣
- SAP接口编程之 NCo3.0系列(06) : 会话管理
- 分布式锁原理介绍
- 利用反射实现类的复制
- 用C语言输出由*组成的菱形
- obj.currentStyle.property、window.getComputedStyle(obj,null).property、obj.style.property 获取与元素属性的总结
- SAP接口编程之 NCo3.0系列(07) : 异常处理
- ruby函数调用
- mybatis源码学习之执行过程分析(3)——mapper接口的获取
- powershell读CSV写入sql server数据库
- [iOS]过渡动画之高级模仿 airbnb
- SAP接口编程 之 JCo3.0系列(01):JCoDestination