码迷,mamicode.com
首页 > 其他好文 > 详细

实现 BeanUtils.copyProperties

时间:2018-10-25 15:42:40      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:catch   role   param   ati   设置   描述   user   public   知识   

将给定源bean的属性值复制到给定的目标bean中

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.flower.sunflower.base.domain.Role;
import sun.flower.sunflower.base.domain.User;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class SpringTest {

    private static final Logger LOGGER = LoggerFactory.getLogger(SpringTest.class);

    /*
      Introspector
      Introspector 类为通过工具学习有关受目标 Java Bean 支持的属性、事件和方法的知识提供了一个标准方法
      对于这三种信息,Introspector 将分别分析 bean 的类和超类,寻找显式或隐式信息,使用这些信息构建一个全面描述目标 bean 的 BeanInfo 对象。
      如果某个类提供有关其自身的显式 BeanInfo,
      则将它添加到从分析所有派生类得到的 BeanInfo 信息中,并将显式信息视为当前类及其基类的确定的信息,无需进一步深入超类链进行分析。
      如果没有在某个类上发现显式 BeanInfo,
      则使用低层次的反射来研究类的方法,并应用标准设计模式来标识属性存储器、事件源或公共方法。
      然后深入分析类的超类,从它那里(可能在超类链的顶部)添加信息。
     */

    /*
      BeanInfo
      该类实现此 BeanInfo 接口并提供有关其 bean 的方法、属性、事件等显式信息。
     */

    /**
     * Copy the property values of the given source bean into the given target bean.
     * 
     * @param source source bean
     * @param target target bean
     * @throws Exception
* @Author YangXuyue
*/ public static void copyProperties(Object source, Object target) throws Exception { // 获取target object的beanInfo BeanInfo beanInfo = Introspector.getBeanInfo(target.getClass()); // 获取target object的属性信息 PropertyDescriptor[] targetPds = beanInfo.getPropertyDescriptors(); // target object的属性setter,source object的属性getter Method writeMethod, readMethod; PropertyDescriptor readPropertyDescriptor; for (PropertyDescriptor targetPd : targetPds) { readPropertyDescriptor = getPropertyDescriptor(source.getClass(), targetPd.getName()); if (null == readPropertyDescriptor) { continue; } readMethod = readPropertyDescriptor.getReadMethod(); writeMethod = targetPd.getWriteMethod(); // Object类中不存在setClass方法 if (null == writeMethod || null == readMethod) { continue; } // 如果getter方法不是public类型,设置accessible为true if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) { readMethod.setAccessible(true); } // 执行getter方法获取数值 Object value = readMethod.invoke(source); // 如果setter方法不是public类型,设置accessible为true if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) { writeMethod.setAccessible(true); } // 赋值 writeMethod.invoke(target, value); } } /** * 根据propertyName获取目标class的propertyDescriptor信息 * * @param clazz 目标class对象 * @param propertyName 目标属性名称 * @return */ private static PropertyDescriptor getPropertyDescriptor(Class<?> clazz, String propertyName) { PropertyDescriptor descriptor = null; try { descriptor = new PropertyDescriptor(propertyName, clazz); } catch (IntrospectionException e) { LOGGER.warn("can‘t find the property what name is {} in {}", propertyName, clazz); } return descriptor; } public static void main(String[] args) throws Exception { // source bean User user = new User(); user.setId(1L); user.setUserName("yangxuyue"); // target bean Role role = new Role(); // copy properties copyProperties(user, role); System.out.println(role); } }

 

实现 BeanUtils.copyProperties

标签:catch   role   param   ati   设置   描述   user   public   知识   

原文地址:https://www.cnblogs.com/yang21/p/9849630.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!