Mmc秒杀圈百科 

Reflection

由 朝武芳乃管理员 最后编辑于 2026-10-04 01:15 · 当前版本 v1
标签:技术正经内容
你尚未登录。登录后可编辑本页与创建新条目 —— 登录 或 注册账号。

本条基于 Java 17(Minecraft 1.20.1 所用版本)。

Reflection(反射,java.lang.reflect)是在运行时获取类、字段、方法、构造器的信息并调用它们的机制。

常用 API

  • Class.forName、getDeclaredField、getDeclaredMethod、getDeclaredConstructor
  • Field.get / Field.set、Method.invoke、Constructor.newInstance
  • setAccessible(true):关闭访问检查,访问 private 成员

模块系统下的限制

  • Java 16 起默认强封装,Java 17 彻底强封装:对未开放(opens)的包调用 setAccessible(true) 会抛 InaccessibleObjectException。
  • 可用 --add-opens 启动参数放开,或借助 Unsafe、MethodHandle 中的 IMPL_LOOKUP 绕过。
  • static final 字段即使 setAccessible(true) 也不能用 Field.set 修改;Java 12 起 Field 的 modifiers 等字段被反射过滤,旧的“去掉 final 修饰符”写法失效。

在模组中

  • Forge 1.20.1 生产环境使用 SRG 名,反射时要写 SRG 名,或使用 ObfuscationReflectionHelper 自动映射。
  • 反射调用有额外开销,热点代码可改用 MethodHandle。
  • 例如通过反射取得 ServerLevel 的 entityTickList,即可直接操作 EntityTickList。
你对本条的回应 · 登录后可表态

讨论(0)

讨论不进入条目正文的版本历史,适合提出修改建议、指出问题或补充来源。
还没有人讨论这个条目。你可以提出修改建议、指出问题或补充来源。

发表话题

请先 登录 后再参与讨论。