zoukankan      html  css  js  c++  java
  • java复制对象,复制对象属性,只可复制两个对象想同的属性名。也可自定义只复制需要的属性。

    注意:使用时copy()方法只会复制相同的属性。常用的copy()方法。以下为封装的工具和使用方式。

    1.封装类

    import java.util.Map;

    import java.util.WeakHashMap;

    import org.springframework.cglib.beans.BeanCopier;
    import org.springframework.cglib.core.Converter;
    public class BeanCopyUtils {
    // 使用WeakHashMap缓存,在内存不足时会自动释放
    private final static Map<String, BeanCopier> BEAN_COPIER_MAP = new WeakHashMap<>();
    private final static Map<String, Converter> CONVERTER_MAP = new WeakHashMap<>();
    private static Object lock1 = new Object();
    private static Object lock2 = new Object();

    private BeanCopyUtils() {
    }

    /**
    * 创建BeanCopier,并缓存
    *
    * @param src
    * @param target
    * @param useConverter
    * @return
    */
    private static BeanCopier getBeanCopier(Object src, Object target, boolean useConverter) {
    String key = generateKey(src, target, useConverter);
    BeanCopier bc = BEAN_COPIER_MAP.get(key);
    if (null == bc) {
    synchronized (lock1) {
    bc = BEAN_COPIER_MAP.get(key);
    if (null == bc) {
    bc = BeanCopier.create(src.getClass(), target.getClass(), useConverter);
    BEAN_COPIER_MAP.put(key, bc);
    System.out.println("Create BeanCopier with key:" + key);
    }
    }
    }
    return bc;
    }

    /**
    * 复制对象属性
    *
    * @param src
    * @param target
    */
    public static void copy(Object src, Object target) {
    BeanCopier bc = getBeanCopier(src, target, false);
    bc.copy(src, target, null);
    }

    /**
    * 使用自定义的属性转换器复制对象属性
    *
    * @param src
    * @param target
    * @param converter
    */
    public static void copy(Object src, Object target, Converter converter) {
    BeanCopier bc = getBeanCopier(src, target, true);
    bc.copy(src, target, converter);
    }

    /**
    * 对象属性复制,只复制fields中指定的属性,每个属性用逗号分隔
    *
    * @param src
    * @param target
    * @param fields
    */
    public static void copyWithFields(Object src, Object target, final String fields) {
    BeanCopier bc = getBeanCopier(src, target, true);
    bc.copy(src, target, newConverter(src, target, fields, true));
    }

    /**
    * 对象属性复制,排除指定属性
    *
    * @param src
    * @param target
    * @param fields
    */
    public static void copyWithoutFields(Object src, Object target, final String fields) {
    BeanCopier bc = getBeanCopier(src, target, true);
    bc.copy(src, target, newConverter(src, target, fields, false));
    }

    /**
    * new属性转换器,
    *
    * @param fields
    * 需要复制或排除的属性
    * @param fieldCopyFlag
    * 属性复制标识 true:表明fields为需要复制的属性;false:表明fields是需要排除复制的属性
    * @return
    */
    private static Converter newConverter(Object src, Object target, final String fields, final boolean fieldCopyFlag) {
    String key = buildConverterkey(src, target, fields, fieldCopyFlag);
    Converter converter = CONVERTER_MAP.get(key);
    if (null == converter) {
    synchronized (lock2) {
    converter = CONVERTER_MAP.get(key);
    if (null == converter) {
    converter = new Converter() {
    @Override
    public Object convert(Object fieldValue, Class fieldType, Object methodName) {
    String field = methodName.toString().substring(3); // 得到属性名,如Name
    field = field.substring(0, 1).toLowerCase() + field.substring(1); // 将首字母小写
    if ((fieldCopyFlag && fields.contains(field))
    || (!fieldCopyFlag && !fields.contains(field))) {
    return fieldValue;
    }
    return null;
    }
    };
    CONVERTER_MAP.put(key, converter);
    System.out.println("Created Converter with key:" + key);
    }
    }
    }
    return converter;
    }

    private static String generateKey(Object src, Object target, boolean useConverter) {
    return src.getClass().getName() + target.getClass().getName() + String.valueOf(useConverter);
    }

    private static String buildConverterkey(Object src, Object target, String fields, boolean copyFlag) {
    String baseKey = generateKey(src, target, true);
    String key = baseKey + fields + String.valueOf(copyFlag);
    return key;
    }

    }

    2.使用实例

    FileCabinet fb = list.get(i);
    FileCabinetReturn fbReturn = new FileCabinetReturn();
    BeanCopyUtils.copy(fb, fbReturn);

  • 相关阅读:
    当你开始学习编程时,你最希望知道什么?我想起来的只有27件事!
    神父说,要有光,要有码农,于是十大天神创造了宏大的编程界!
    我今天就要说HTML它就是一门编程语言!只有外行才说它是超文本标记语言!
    【源码分享】用C++实现通讯录管理系统!功能齐全,实属精品!
    虎牙员工自曝被公司HR带着五个人抬出公司扔到门外!虎牙回应:他简历造假!
    C与C++的互相调用!就像大学宿舍一样,我用你的,你用我的!
    为什么你的简历总会石沉大海!一定要真实,切勿造假!
    Python3列表
    Python3元组
    线程回收
  • 原文地址:https://www.cnblogs.com/guangxiang/p/11061265.html
Copyright © 2011-2022 走看看