Java里面类的拷贝 java类属性拷贝

发布时间:2023-05-18 09:14:30

package org.leno.demo;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 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()){                            ///通过属性名获得相应的get和set方法的名称                            String getMethodName = "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);                            String setMethodName = "set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);                            ///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(“同名属性类型不匹配!");                     }              }       }      } 

本文是转载内容,我们尊重原作者对文章的权利。如有内容错误或侵权行为,请联系我们更正或删除文章。

上一篇 Java线程池的核心线程数如何设置 java线程池设计
下一篇 Java校验非负数 java校验是不是数字

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题