457. Java 反射 - 深度访问
发布时间:2026/7/8 14:00:56
分类:文化教育
浏览:1234

文章目录457. Java 反射 - 深度访问1. 深度访问示例修改私有字段2. 深度反射与 Java 模块系统3. 总结457. Java 反射 - 深度访问到目前为止我们看到的都是安全的反射操作获取公共方法调用静态方法调用接口方法这些方法没有真正突破 Java 的访问控制唯一“危险”的地方是编译器无法保证方法存在或可访问。现在我们要尝试深入镜子操作私有字段和不可见的成员。1. 深度访问示例修改私有字段假设我们有一个简单的Person类publicclassPerson{privatefinalStringname;privatefinalintage;publicPerson(Stringname,intage){this.namename;this.ageage;}OverridepublicStringtoString(){returnname (age);}}我们想通过 Reflection修改私有且final的字段importjava.lang.reflect.Field;publicclassFountainOfYouth{publicstaticvoidmain(String[]args)throwsReflectiveOperationException{PersonpersonnewPerson(Heinz Kabutz,51);System.out.println(person);// 获取私有字段FieldageFieldPerson.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但通过深度反射我们仍然可以修改它如果Person是record则无法通过深度反射修改字段2. 深度反射与 Java 模块系统在 Java 9 之后引入了模块系统Module System深度反射只有在模块开放的情况下才可用理想情况下应请求模块作者开放包给你的模块否则你可能需要通过--add-opens命令行参数强行打开包不推荐⚠风险提示深度反射可能破坏封装模块升级或字段更改可能导致反射代码崩溃仅在绝对必要时使用3. 总结浅层反射访问公共方法、调用静态方法安全、常用深度反射访问私有、final字段和方法危险且不推荐模块与安全深度反射受模块访问限制不要随意依赖模块内部实现细节