proxy可通过get/set陷阱实现属性读写时的自动格式转换:get用于只读转换(如时间戳转日期字符串),set用于输入标准化(如字符串trim并转大写),二者配合可做到双向透明转换,且需用reflect方法避免递归与赋值失效。

Proxy 可以在读取或设置属性时拦截操作,从而实现对属性值的自动格式转换,比如将字符串转为数字、日期标准化、大小写统一等。
用 get 拦截读取,做输出格式转换
当访问对象属性时,通过 get 陷阱对返回值做处理,不改变原始数据,只影响读取结果。
- 适合做「只读转换」,如把存储的毫秒时间戳转成 YYYY-MM-DD 格式字符串
- 注意避免无限递归:内部读取目标属性要用
Reflect.get(target, prop, receiver) - 可结合类型判断做差异化处理,比如对 number 类型转百分比,string 类型 trim 或 toLowerCase
用 set 拦截赋值,做输入格式标准化
在属性被赋值时,先转换再存入目标对象,确保底层数据符合预期格式。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 例如:用户输入 "2024-01-01",自动转成 Date 实例;输入 " hello ",存入前 trim 并转大写
- 务必用
Reflect.set()写入,否则无法真正更新目标对象 - 可配合验证逻辑,转换失败时抛错或静默忽略(按需选择)
get + set 配合,实现双向透明转换
同时使用两个陷阱,让开发者像操作普通对象一样,却自动完成格式收发。
- 典型场景:表单模型中,后端要 ISO 字符串,前端想用 Date 对象操作 → set 存 Date,get 返回格式化字符串
- 关键点:原始值和展示值分离,Proxy 不修改源数据结构,仅控制访问接口
- 避免副作用:转换逻辑应是纯函数,不依赖外部状态,保证可预测性
注意边界与性能
Proxy 是运行时拦截,不是编译时转换,需留意实际影响。
- 深层嵌套对象需递归代理,或配合 Reflect.ownKeys / has 等陷阱完善行为
- 频繁访问的属性(如循环中)慎用复杂转换,可能影响性能
- JSON.stringify() 默认不触发 get,如需格式化输出,得手动调用或重写 toJSON
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










