当前位置: 首页 > news >正文

457. Java 反射 - 深度访问

文章目录

  • 457. Java 反射 - 深度访问
    • 1. 深度访问示例:修改私有字段
    • 2. 深度反射与 Java 模块系统
    • 3. 总结

457. Java 反射 - 深度访问

到目前为止,我们看到的都是安全的反射操作

  • 获取公共方法
  • 调用静态方法
  • 调用接口方法

这些方法没有真正突破 Java 的访问控制,唯一“危险”的地方是编译器无法保证方法存在或可访问。

现在,我们要尝试深入镜子,操作私有字段和不可见的成员。


1. 深度访问示例:修改私有字段

假设我们有一个简单的Person类:

publicclassPerson{privatefinalStringname;privatefinalintage;publicPerson(Stringname,intage){this.name=name;this.age=age;}@OverridepublicStringtoString(){returnname+" ("+age+")";}}

我们想通过 Reflection修改私有且final的字段

importjava.lang.reflect.Field;publicclassFountainOfYouth{publicstaticvoidmain(String[]args)throwsReflectiveOperationException{Personperson=newPerson("Heinz Kabutz",51);System.out.println(person);// 获取私有字段FieldageField=Person.class.getDeclaredField("age");ageField.setAccessible(true);// ⚠ 开启深度反射// 修改字段值intage=(int)ageField.get(person);age*=0.9;// 年轻 10%ageField.set(person,age);System.out.println(person);}}

输出示例

HeinzKabutz(51)HeinzKabutz(45)

说明

  • 虽然age字段是private final,但通过深度反射,我们仍然可以修改它
  • 如果Personrecord,则无法通过深度反射修改字段

2. 深度反射与 Java 模块系统

在 Java 9 之后,引入了模块系统(Module System):

  • 深度反射只有在模块开放的情况下才可用
  • 理想情况下,应请求模块作者开放包给你的模块
  • 否则,你可能需要通过--add-opens命令行参数强行打开包(不推荐)

风险提示

  • 深度反射可能破坏封装
  • 模块升级或字段更改可能导致反射代码崩溃
  • 仅在绝对必要时使用

3. 总结

  1. 浅层反射:访问公共方法、调用静态方法,安全、常用
  2. 深度反射:访问私有、final字段和方法,危险且不推荐
  3. 模块与安全
    • 深度反射受模块访问限制
    • 不要随意依赖模块内部实现细节
http://www.jsqmd.com/news/1148143/

相关文章:

  • AI Agent智能体开发公司推荐:2026年最新榜单
  • 气动系统是否可以完全替代液压系统?
  • 高压隔离技术:ISOM8710与PIC32MZ的工业应用解析
  • Ubuntu 22.04 LTS 软件安装:APT、Snap、Flatpak 3种方案性能与生态对比
  • 如何简单彻底清理Windows“此电脑“中的顽固图标:MyComputerManager完整指南
  • 2026.7.7最新财经播报综合分析
  • Horizon 8 企业CA证书实战:从OpenSSL生成到Connection Server部署的5个关键步骤
  • Kubernetes 探针实战:liveness、readiness、startup 到底怎么配
  • 模型监控实战:性能追踪/数据漂移/自动告警
  • 虚拟机实战WindowsServer2019系统上部署远程访问路游服务充当中继器分配IP
  • Scikit-learn 1.3+ 逻辑回归实战:鸢尾花二分类准确度提升至 98% 的 3 个调参技巧
  • frogClip 一款优秀的现代化历史剪切板工具
  • 液冷板焊接技术路线对比:环形光斑、振镜摆动、复合焊接各有什么绝活
  • Fluent meshing 网格剖分技巧分享
  • HarmonyOS7 搜索栏布局:flexGrow 让输入框吃掉剩余空间
  • 如何部署一个本地的Deepseek(离线无需联网)
  • Fable 5 潜力大但可靠性堪忧,独立程序员为何暂不考虑使用?
  • 传闻Gemini 3.5 Pro 7月17日亮相,前端生成能力超Fable 5但推理仍有短板
  • LLM 不直接改代码,也能让程序跑快 3 倍?
  • 【小白也能轻松玩转龙虾】虾壳云一键部署离线智能体,断网也能正常使用 OpenClaw v2.7.9(附最新安装包)
  • 如何通过pdfh5.js实现移动端PDF预览的终极解决方案
  • 鱼皮 yu-rpc:从 0 到 1 手写 RPC 框架的实践教程
  • ONNX Runtime GPU 推理性能调优:对比 PyTorch 原生推理 3 倍加速方案
  • 现在做 AI 产品,最不值钱的可能就是“接了一个大模型”
  • ComfyUI幻术工作流:AI视觉错觉技术原理与实战指南
  • 3分钟解锁Android固件:Firmware Extractor终极提取指南
  • Python深入浅出:从入门到工程实践8
  • 什么是 EMC?(电磁兼容性)
  • Apache 2.4.49 路径穿越漏洞 CVE-2021-41773:3步复现与1个关键配置修复
  • 鸿蒙原生 ArkTS 布局方式之 WaterFlow 瀑布流布局入门