Java中利用反射原理拷贝对象

简介:
测试类
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

public class Test
{
/**
* 拷贝对象方法
*/
public static Object copy(Object objSource) 
              throws IllegalArgumentException, SecurityException, InstantiationException, 
                     IllegalAccessException, InvocationTargetException,NoSuchMethodException
{
// 获取源对象类型
Class<?> clazz = objSource.getClass();
// 获取源对象构造函数
Constructor<?> construtctor = clazz.getConstructor();
// 实例化出目标对象
Object objDes = construtctor.newInstance();
// 获得源对象所有属性
Field[] fields = clazz.getDeclaredFields();
// 遍历所有属性
for (int i = 0; i < fields.length; i++)
{
// 属性对象
Field field = fields[i];
// 属性名
String fieldName = field.getName();
// 获取属性首字母
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// 拼接get方法名如getName
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 得到get方法对象
Method getMethod = clazz.getMethod(getMethodName);
// 对源对象调用get方法获取属性值
Object value = getMethod.invoke(objSource);

// 拼接set方法名
String setMethodName = "set" + firstLetter + fieldName.substring(1);
// 获取set方法对象
Method setMethod = clazz.getMethod(setMethodName, new Class[] { field.getType() });
// 对目标对象调用set方法装入属性值
setMethod.invoke(objDes, new Object[] { value });
}
return objDes;
}


public static void main(String[] args) 
        throws IllegalArgumentException, SecurityException,InstantiationException,                        
                       IllegalAccessException,InvocationTargetException, NoSuchMethodException
{
// 学生源对象
Student studentSource = new Student();
studentSource.setNum(1);
studentSource.setName("xy");
studentSource.setBirthDay(new Date());

 // 复制学生对象
Student studentDes = (Student) copy(studentSource);
System.out.println(studentDes.getName());
}
}

实体类
public class Student
{
private int num;
private String name;
private Date birthDay;

public Student()
{
super();
}

public Student(int num, String name, Date birthDay)
{
super();
this.num = num;
this.name = name;
this.birthDay = birthDay;
}

public int getNum()
{
return num;
}

public void setNum(int num)
{
this.num = num;
}

public String getName()
{
return name;
}

public void setName(String name)
{
this.name = name;
}

public Date getBirthDay()
{
return birthDay;
}

public void setBirthDay(Date birthDay)
{
this.birthDay = birthDay;
}

}

注意因为在copy方法中调用的newInstance是不带参数的,所以student类中必须有空构造方法。


目录
相关文章
|
传感器 人工智能 监控
Springcloud+Vue智慧工地管理云平台源码 AI智能识别
“智慧工地管理平台”以现场实际施工及管理经验为依托,针对工地现场痛点,能在工地落地实施的模块化、一体化综合管理平台。为建筑公司、地产公司、监管单位租赁企业、设备生产厂提供了完整的数据接入和管理服务。
215 2
|
人工智能
IDEA完全免费AI辅助编程插件BITO-GPT4安装及中文国产化设置
IDEA完全免费AI辅助编程插件BITO-GPT4安装及中文国产化设置
1782 1
|
架构师 开发者 运维
开发人员各级岗位胜任力模型
上个月,我写了一篇《架构设计师能力模型》,为开发者指出一些发展的方向、架构师的能力要求,以及需要学习的相关知识。 本月,我为公司的人力部门编制了更加量化的《2017年研发人员岗位能力模型 V1.4》。
10347 0
|
7月前
|
人工智能 机器人 API
搞定!微信接入DeepSeek打造聊天机器人,1行代码就行!
程序员晚枫分享了一个有趣的Python项目,将DeepSeek大模型接入微信,实现自动聊天。通过PyOfficeRobot库,仅需1行代码即可完成接入,打造AI聊天机器人。该项目基于Windows API操作微信,目前仅支持Windows系统。用户需填写好友名称和API Key,轻松体验AI对话。此外,PyOfficeRobot还支持其他大模型如阿里通义、智谱等。欢迎尝试并参与改进开源项目。
1012 81
搞定!微信接入DeepSeek打造聊天机器人,1行代码就行!
|
8月前
|
弹性计算 运维 安全
为了提升运维工程师及开发者
为了提升运维工程师及开发者
|
11月前
|
机器学习/深度学习 人工智能 小程序
做AI运动小程序有哪些解决方案,如何进行选型?
随着深度学习技术的发展,AI运动应用如“天天跳绳”和“百分运动”变得流行。本文探讨了将AI运动功能引入微信小程序的可行性,并介绍了几种解决方案。实现AI运动计数的关键技术包括视频抽帧、人体检测、姿态识别等。文中详细描述了离线方案(全离线和半离线)和原生方案(自研AI引擎和成熟插件)的不同实现方式,并对各种方案进行了对比,建议优先选择成本低、体验佳的AI运动识别插件方案。
|
存储 运维 监控
Entity Framework Core 实现审计日志记录超棒!多种方法助你跟踪数据变化、监控操作,超实用!
【8月更文挑战第31天】在软件开发中,审计日志记录对于跟踪数据变化、监控用户操作及故障排查至关重要。Entity Framework Core (EF Core) 作为强大的对象关系映射框架,提供了多种实现审计日志记录的方法。例如,可以使用 EF Core 的拦截器在数据库操作前后执行自定义逻辑,记录操作类型、时间和执行用户等信息。此外,也可通过在实体类中添加审计属性(如 `CreatedBy`、`CreatedDate` 等),并在保存实体时更新这些属性来记录审计信息。这两种方法都能有效帮助我们追踪数据变更并满足合规性和安全性需求。
460 0
|
JavaScript 前端开发 Java
若依部署-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_error]
若依部署-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_error]
|
Kubernetes 关系型数据库 网络架构
ray集群部署vllm的折磨
概括如下: 在构建一个兼容多种LLM推理框架的平台时,开发者选择了Ray分布式框架,以解决资源管理和适配问题。然而,在尝试集成vllm时遇到挑战,因为vllm内部自管理Ray集群,与原有设计冲突。经过一系列尝试,包括调整资源分配、修改vllm源码和利用Ray部署的`placement_group_bundles`特性,最终实现了兼容,但依赖于非官方支持的解决方案。在面对vllm新版本和Ray部署的`reconfigure`方法问题时,又需权衡和调整实现方式。尽管面临困难,开发者认为使用Ray作为统一底层仍具有潜力。
|
网络架构 Windows
解决Windows 11网络连接问题:教你轻松排查网络故障
解决Windows 11网络连接问题:教你轻松排查网络故障
952 1