Java反射通用对象拷贝支持浅拷贝与安全深拷贝,处理基本类型、集合、嵌套对象等,规避空值、不可变类及循环引用,并通过注解和类型转换增强实用性。

Java 反射实现通用对象拷贝,核心是通过 Field 获取属性、绕过访问限制、读取源对象值并写入目标对象。关键在于处理基本类型、包装类、String、数组、集合、嵌套对象等常见情况,同时规避循环引用和不可变类型问题。
基础反射拷贝:支持同类型浅拷贝
适用于字段名、类型完全一致的两个对象(如 DTO 与 VO),不递归拷贝引用对象。
- 用
Class.getDeclaredFields()获取全部字段(含 private) - 对每个字段调用
setAccessible(true)突破封装 - 用
field.get(src)读值,field.set(dest, value)写值 - 跳过 static / final 字段(无意义或抛异常)
安全深拷贝:递归处理嵌套对象与集合
避免浅拷贝导致的修改干扰,需识别可拷贝类型并递归调用自身。
- 对字段值做类型判断:基本类型、String、包装类 → 直接赋值
- 数组 → 创建新数组,逐元素递归拷贝(注意多维数组)
- List/Set → 新建对应集合,遍历元素递归拷贝后 add
- Map → 新建 HashMap,key 和 value 均递归拷贝(key 为不可变类型更稳妥)
- 自定义对象(非上述类型)→ 若有无参构造器,newInstance() 后递归填充字段
规避风险:空值、不可变类与循环引用
生产环境必须处理边界情况,否则运行时崩溃或数据错乱。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- 源字段为 null 时,目标字段也设为 null(不 new 对象)
- 跳过不可实例化类型:Class、Enum、Lambda 表达式、void 等
- 用
IdentityHashMap<Object, Object>记录已拷贝对象,检测循环引用(如 A.b = B, B.a = A) - 对 final 字段,仅当 JVM 允许(如 Unsafe 或特定 JDK 版本)才尝试写入,否则日志警告并跳过
实用增强:支持注解控制与类型映射
提升灵活性,适配真实业务场景(如忽略字段、重命名、类型转换)。
- 定义
@IgnoreCopy注解,反射读取时跳过被标记字段 - 定义
@CopyAs("targetField")实现字段名映射(需目标类有对应 setter 或字段) - 内置简单类型转换:String ↔ Integer/LocalDateTime(配合 DateTimeFormatter)
- 允许传入自定义 Converter 接口,处理复杂转换逻辑(如枚举 code ↔ name)
不复杂但容易忽略:务必在 catch 中处理 IllegalAccessException、InstantiationException 等,并提供清晰错误信息(如“字段 xxx 不可访问”或“类 xxx 无默认构造器”)。实际项目中建议搭配 Lombok 的 @Builder 或 MapStruct 使用,反射拷贝更适合配置驱动或低侵入场景。

















