实体类参数复制

本文介绍了一种使用BeanCopier进行实体类参数复制的方法,特别适用于VO到实体Bean的转换,当参数名相同时自动复制,不同名时需手动处理。文章详细解释了BeanCopier的使用场景和局限,包括属性类型不匹配、get/set方法不一致时的解决方案。

实体类参数复制:用于接收的VO,复制到实体Bean里面,要求参数名相同,不同的参数名手动get   set添加

package com.bofeng.smart.school.common.bean;

import org.springframework.cglib.beans.BeanCopier;

import java.util.HashMap;
import java.util.Map;

/**
 * 将beancopier做成静态类,方便拷贝
 * <br>创建日期:2015年12月1日
 * <br><b>Copyright 2015 UTOUU All Rights Reserved</b>
 *
 * @author yushaojian
 * @version 1.0
 * @since 1.0
 */
public class BeanUtils {

    public static final Map<String, BeanCopier> BEAN_COPIERS = new HashMap<String, BeanCopier>();

    /**
     * @param source 资源类
     * @param target 目标类
     * @Title: copyProperties
     * @Description:
     *     (1)相同属性名,且类型不匹配时候的处理,ok,但是未满足的属性不拷贝;
     *     (2)get和set方法不匹配的处理,创建拷贝的时候报错,无法拷贝任何属性(当且仅当sourceClass的get方法超过set方法时出现)
     *     (3)BeanCopier
     *     初始化例子:BeanCopier copier = BeanCopier.create(Source.class, Target.class, useConverter=true)
     *     第三个参数userConverter,是否开启Convert,默认BeanCopier只会做同名,同类型属性的copier,否则就会报错.
     *     copier = BeanCopier.create(source.getClass(), target.getClass(), false);
     *     copier.copy(source, target, null);
     *     (4)修复beanCopier对set方法强限制的约束
     *     改写net.sf.cglib.beans.BeanCopier.Generator.generateClass(ClassVisitor)方法
     *     将133行的
     *     MethodInfo write = ReflectUtils.getMethodInfo(setter.getWriteMethod());
     *     预先存一个names2放入
     *      109        Map names2 = new HashMap();
     *      110        for (int i = 0; i < getters.length; ++i) {
     *      111          names2.put(setters[i].getName(), getters[i]);
     *                 }
     *     调用这行代码前判断查询下,如果没有改writeMethod则忽略掉该字段的操作,这样就可以避免异常的发生。
     * @author yushaojian
     * @date 2015年11月25日下午4:56:44
     */
    public static void copyProperties(Object source, Object target) {
        String beanKey = generateKey(source.getClass(), target.getClass());
        BeanCopier copier = null;
        if (!BEAN_COPIERS.containsKey(beanKey)) {
            copier = BeanCopier.create(source.getClass(), target.getClass(), false);
            BEAN_COPIERS.put(beanKey, copier);
        } else {
            copier = BEAN_COPIERS.get(beanKey);
        }
        copier.copy(source, target, null);
    }

    private static String generateKey(Class<?> class1, Class<?> class2) {
        return class1.toString() + class2.toString();
    }

}  

测试用例::

BeanUtils.copyProperties(a,q);
        q.setA(a.getA());
        q.setB(a.getB());

a是有数据的类,q是需要被复制进去数据的类(没数据)

 

在Java中,实体类复制有多种方法,以下为你详细介绍: ### Spring BeanUtils方法 Spring项目中自带的BeanUtils工具方法可用于实体类复制。使用时,第一个参数是源数据,第二个参数是要复制的目标对象。示例代码如下: ```java import org.springframework.beans.BeanUtils; public class EntityCopyExample { public static void main(String[] args) { SourceEntity source = new SourceEntity(); TargetEntity target = new TargetEntity(); BeanUtils.copyProperties(source, target); } } class SourceEntity { // 源实体类属性 } class TargetEntity { // 目标实体类属性 } ``` 不过该方法存在弊端,内部实例复制过程不清晰,对其他开发人员不太友好,因此不建议使用[^1][^4]。 ### 最朴素的get、set方式 直接使用最朴素的get、set方式赋值,这种方式虽然需要编写较多代码,但逻辑清晰,易于理解和维护。示例代码如下: ```java public class EntityCopyExample { public static void main(String[] args) { SourceEntity source = new SourceEntity(); TargetEntity target = new TargetEntity(); target.setField1(source.getField1()); target.setField2(source.getField2()); // 其他属性的复制 } } class SourceEntity { private String field1; private int field2; public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public int getField2() { return field2; } public void setField2(int field2) { this.field2 = field2; } } class TargetEntity { private String field1; private int field2; public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public int getField2() { return field2; } public void setField2(int field2) { this.field2 = field2; } } ``` 这是目前主流的不同实体类复制值的方式[^1]。 ### 实体类List复制 #### 方式一 使用`BeanUtils.copyProperties`方法进行实体类List复制,但注意`list1`中不能有`null`。示例代码如下: ```java import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.List; public class EntityListCopyExample { public static void main(String[] args) { List<SourceEntity> list1 = new ArrayList<>(); List<TargetEntity> list2 = new ArrayList<>(); // 假设list1已经有数据 BeanUtils.copyProperties(list1, list2); } } class SourceEntity { // 源实体类属性 } class TargetEntity { // 目标实体类属性 } ``` #### 方式二 将实体类List转换为Json字符串,再将Json字符串转为另一个List。这种方式不存在`list`中不能有`null`的限制。示例代码如下: ```java import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.List; public class EntityListCopyExample { public static void main(String[] args) { List<SourceEntity> userList = new ArrayList<>(); String json = JSON.toJSONString(userList); List<TargetEntity> list = JSON.parseArray(json, TargetEntity.class); } } class SourceEntity { // 源实体类属性 } class TargetEntity { // 目标实体类属性 } ``` ### 相同(或继承)实体类复制 若有实体类存在继承关系,如`Class1 extends Student`,拿到的数据是`Student`或`Class1`,可直接使用`BeanUtils.copyProperties`方法。示例代码如下: ```java import org.springframework.beans.BeanUtils; public class InheritedEntityCopyExample { public static void main(String[] args) { Student student = new Student(); Class1 class1 = new Class1(); BeanUtils.copyProperties(student, class1); } } class Student { // 父实体类属性 } class Class1 extends Student { // 子实体类属性 } ``` [^1][^2][^3][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值