Mmc秒杀圈百科 

MethodHandle

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

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

MethodHandle(java.lang.invoke.MethodHandle)是 Java 7 引入的方法句柄,可以指向方法、构造器或字段的 getter / setter,通过 invokeExact / invoke 调用。

获取

通过 MethodHandles.Lookup:findVirtual、findStatic、findSpecial、findConstructor、findGetter / findSetter、findStaticGetter / findStaticSetter,或用 unreflect* 把 Reflection 得到的对象转成句柄。

访问权限

  • Lookup 的权限取决于创建它的类:MethodHandles.lookup() 只有调用者的权限;privateLookupIn 要求目标模块对调用者开放。
  • MethodHandles.Lookup.IMPL_LOOKUP 是 JDK 内部拥有全部权限(TRUSTED)的私有静态字段。常见做法是用 Unsafe 的 staticFieldBase / staticFieldOffset + getObject 读出它,从而无视模块封装访问任意成员,也能为 final 字段生成 setter。
  • 被 JIT 常量折叠的 static final 字段,即使改了值,已编译的代码也可能仍用旧值。

与反射的对比

  • 访问检查在创建句柄时做一次,调用时不再检查。
  • 存在 static final 字段里的句柄可被 JIT 内联,性能接近直接调用。
  • 字段的原子操作可用同包下的 VarHandle(Java 9+)。

在模组中

可用它高效地读写 ServerLevel、EntityLookup 等类的私有字段;与反射一样,生产环境要使用 SRG 名。

你对本条的回应 · 登录后可表态

讨论(0)

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

发表话题

请先 登录 后再参与讨论。