将一个实体类赋值到另一个实体类

本文介绍了一种实用的方法,用于将一个实体类的数据复制到另一个实体类中,同时提供了排除特定字段的功能。此方法通过反射机制实现,适用于.NET平台。

/// <summary>
/// 将一个实体类复制到另一个实体类
/// </summary>
/// <param name="objectsrc">源实体类</param>
/// <param name="objectdest">复制到的实体类</param>
/// <param name="excudeFields">不复制的属性</param>
public void EntityToEntity(object objectsrc, object objectdest,params string[] excudeFields) {
var sourceType = objectsrc.GetType();
var destType = objectdest.GetType();
foreach (var item in destType.GetProperties())
{
if(excudeFields.Any(x=>x.ToUpper()==item.Name))
continue;
item.SetValue(objectdest, sourceType.GetProperty(item.ToString().ToLower()).GetValue(objectsrc, null), null);
}


一个实体类赋值一个实体类有以下几种常见方法: ### 方式一:通过转换为 JSONObject 这种方法借助 JSON 序列化和反序列化实现实体类的复制。示例代码如下: ```java import com.alibaba.fastjson.JSONObject; class UserInfoEntity { private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } class UserVO { private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } public class Main { public static void main(String[] args) { UserInfoEntity userInfoEntity = new UserInfoEntity(); userInfoEntity.setId(1L); JSONObject userInfoEntity1 = JSONObject.parseObject(JSONObject.toJSONString(userInfoEntity)); UserVO userInfo = JSONObject.toJavaObject(userInfoEntity1, UserVO.class); } } ``` 此方法的优点是简单方便,不需要关心属性的具体类型和名称,只要 JSON 能序列化和反序列化的属性都能处理;缺点是性能相对较低,因为涉及到 JSON 的序列化和反序列化操作,并且对于一些特殊类型可能需要自定义序列化和反序列化规则 [^1]。 ### 方式二:自定义属性赋值方法 可以编写一个工具类,根据属性名称和属性类型来判断是否进行赋值。示例代码如下: ```java import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; class AppointmentOrderParam { private String apointmentTime; public String getApointmentTime() { return apointmentTime; } public void setApointmentTime(String apointmentTime) { this.apointmentTime = apointmentTime; } } class AppointmentOrder { private java.util.Date apointmentTime; public java.util.Date getApointmentTime() { return apointmentTime; } public void setApointmentTime(java.util.Date apointmentTime) { this.apointmentTime = apointmentTime; } } public class BeanCopyUtil { public static void copyProperties(Object source, Object target) throws Exception { BeanInfo sourceBean = Introspector.getBeanInfo(source.getClass()); PropertyDescriptor[] sourceProperty = sourceBean.getPropertyDescriptors(); BeanInfo targetBean = Introspector.getBeanInfo(target.getClass()); PropertyDescriptor[] targetProperty = targetBean.getPropertyDescriptors(); for (int i = 0; i < sourceProperty.length; i++) { for (int j = 0; j < targetProperty.length; j++) { if (sourceProperty[i].getName().equals(targetProperty[j].getName()) && sourceProperty[i].getPropertyType().equals(targetProperty[j].getPropertyType())) { Method sourceGetMethod = sourceProperty[i].getReadMethod(); Method targetSetMethod = targetProperty[j].getWriteMethod(); if (sourceGetMethod != null && targetSetMethod != null) { Object value = sourceGetMethod.invoke(source); targetSetMethod.invoke(target, value); } break; } } } } public static void main(String[] args) throws Exception { AppointmentOrderParam param = new AppointmentOrderParam(); param.setApointmentTime("2024-01-01"); AppointmentOrder order = new AppointmentOrder(); copyProperties(param, order); } } ``` 这种方法的优点是可以灵活控制属性的赋值,对于类型不匹配的属性可以进行特殊处理;缺点是代码量相对较大,需要手动编写属性赋值的逻辑 [^2]。 ### 方式三:使用 BeanUtils.copyProperties() 方法 在 Java 开发中,有两个常用的 `BeanUtils` 类,分别是 `org.springframework.beans.BeanUtils` 和 `org.apache.commons.beanutils.BeanUtils`,它们的 `copyProperties()` 方法使用方式有所不同。示例代码如下: ```java import org.springframework.beans.BeanUtils; class OrderInfo { private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } class OrderVo extends OrderInfo { // 可以有额外的属性 } public class Main { public static void main(String[] args) { OrderInfo orderInfo = new OrderInfo(); orderInfo.setId(1L); OrderVo orderVo = new OrderVo(); // 使用 org.springframework.beans.BeanUtils BeanUtils.copyProperties(orderInfo, orderVo); } } ``` 使用 `org.springframework.beans.BeanUtils` 时,第一个参数是源对象,第二个参数是目标对象,即把源对象的属性值复制到目标对象;而 `org.apache.commons.beanutils.BeanUtils` 的 `copyProperties()` 方法参数赋值是相反的。这种方法的优点是简单易用,代码量少;缺点是对于类型不匹配的属性可能会抛出异常,需要进行额外的处理 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值