利用反射实现类的复制

来源:互联网 发布:公章可以在淘宝上刻吗 编辑:程序博客网 时间: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
原创粉丝点击