JavaBean属性拷贝

package org.leno.demo;

 

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

 

/**

 * @author leno

 *    做一个方法,可以将一个JavaBean风格对象的属性值拷贝到另一个对象的同名属性中

 *    (如果不存在同名属性的就不拷贝)

 */

public class BeanUtils {

 

       @SuppressWarnings("unchecked")

       public static void copyProperties(Object target,Object source) throws Exception{

              /*分别获得源对象和目标对象的Class类型对象,Class对象是整个反射机制的源头和灵魂!

                Class对象是在类加载的时候产生,保存着类的相关属性,构造器,方法等信息

              */

              Class sourceClz = source.getClass();

              Class targetClz = target.getClass();

              //得到Class对象所表征的类的所有属性(包括私有属性)

              Field[] fields = sourceClz.getDeclaredFields();

              for (int i = 0; i < fields.length; i++) {

                     String fieldName = fields[i].getName();

                     Field targetField  = null;

                     try {

                            //得到targetClz对象所表征的类的名为fieldName的属性,不存在就进入下次循环

                             targetField = targetClz.getDeclaredField(fieldName);

                     } catch (SecurityException e) {

                            e.printStackTrace();

                            break;

                     } catch (NoSuchFieldException e) {

                            continue;

                     }

                     //判断sourceClz字段类型和targetClz同名字段类型是否相同

                     if(fields[i].getType()==targetField.getType()){

                            //由属性名字得到对应getset方法的名字

                            String getMethodName = "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);

                            String setMethodName = "set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);

                            //由方法的名字得到getset方法的Method对象

                            Method getMethod;

                            try {

                                   getMethod = sourceClz.getDeclaredMethod(getMethodName, new Class[]{});

                                   Method setMethod = targetClz.getDeclaredMethod(setMethodName, fields[i].getType());

                                   //调用source对象的getMethod方法

                                   Object result = getMethod.invoke(source, new Object[]{});

                                   //调用target对象的setMethod方法

                                   setMethod.invoke(target, result);

                            } catch (SecurityException e) {

                                   // TODO Auto-generated catch block

                                   e.printStackTrace();

                            } catch (NoSuchMethodException e) {

                                   // TODO Auto-generated catch block

                                   e.printStackTrace();

                            } catch (IllegalArgumentException e) {

                                   // TODO Auto-generated catch block

                                   e.printStackTrace();

                            } catch (IllegalAccessException e) {

                                   // TODO Auto-generated catch block

                                   e.printStackTrace();

                            } catch (InvocationTargetException e) {

                                   // TODO Auto-generated catch block

                                   e.printStackTrace();

                            }

                     }else{

                            throw new Exception("同名属性类型不匹配!");

                     }

              }

       }

      

}

 

 

BeanUtils.copyProperties()是一个常用的JavaBean属性拷贝工具,它可以将一个JavaBean属性拷贝到另一个JavaBean中对应的属性中,但是如果id属性的类型不同或者存在访问权限的问题,可能会导致拷贝失败。以下是可能导致拷贝失败的几个原因: 1. id属性的类型不同:如果源对象和目标对象的id属性类型不同,可能会导致拷贝失败。例如,源对象的id属性类型为Long,而目标对象的id属性类型为Integer,这时候拷贝就会失败。 2. id属性不存在或存在访问权限问题:如果源对象和目标对象的id属性不存在,或者存在访问权限问题,也会导致拷贝失败。例如,源对象的id属性是私有的,而目标对象没有提供setter方法,这时候拷贝也会失败。 为了解决这些问题,你可以尝试以下几种方法: 1. 保证源对象和目标对象的id属性类型相同:如果源对象和目标对象的id属性类型不同,可以尝试将它们的类型转换成相同的类型,例如将Long类型转换成Integer类型。 2. 确保id属性存在且访问权限正确:可以通过给源对象或目标对象添加getter和setter方法来确保id属性存在,并且确保它们的访问权限正确。 3. 手动赋:如果拷贝失败,也可以手动赋。例如,可以使用源对象的getId()方法获取id属性,然后再使用目标对象的setId()方法将其设置到目标对象中。但是需要注意的是,这种方法只适用于单个属性拷贝,如果需要拷贝多个属性,还是建议使用BeanUtils.copyProperties()方法。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值