实现 BeanUtils.copyProperties

Posted yang21

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现 BeanUtils.copyProperties相关的知识,希望对你有一定的参考价值。

将给定源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的主要内容,如果未能解决你的问题,请参考以下文章

多线程的实现之实现Runnable接口

当一个类实现一个接口时,它必须实现该接口中的所有方法。(判断题)

项目——博客系统

java中,一个类实现了某个接口,啥意思?实现它,可以干啥

JAVA框架如何实现调用接口的实现类的呢?例实现httpsessionlistener接口类被调。

水平集图像分割并行加速算法设计与实现(串行OpenMPCUDA)——串行实现篇