Caller 与 Getter

基本信息

属性 值
位置 segment/caller/(7 文件)+ segment/getter/(3 文件)
启用版本 Minecraft 1.7.10

保护规则取值的两层结构:Getter 声明「取哪个值」,Caller 负责「怎么取到」。

getter/(3 个)

类 作用
Getter 抽象基类;invoke(类型, instance, object) 是取值入口
GetterConstant 返回固定常量,不依赖被检查对象
GetterDynamic 运行时动态求值

Condition.execute() 中的调用形式固定为:

getters.get(name).invoke(Type.class, instance, object)

即传入目标类型与 (instance, object) 两个对象,由 Getter 决定返回什么。

caller/(7 个)

类 作用
Caller 抽象基类 + Serializer(Gson 适配,ProtectionParser.java:26 注册)
CallerFormula 公式化取值
CallerNBT 从 NBT 标签取值
caller/reflect/ReflectCallerField 反射取字段
caller/reflect/ReflectCallerMethod 反射取方法
caller/reflectasm/ASMCallerField ASM 字节码取字段
caller/reflectasm/ASMCallerMethod ASM 字节码取方法

实现要点

⚠️ Reflect 与 ASM 是两套并行实现,覆盖同样的「取字段 / 取方法」两种需求。 1.7.10 下字段与方法访问的可见性差异,是同时存在两套的典型原因; 判断某个保护规则走哪条路,要看其 JSON 里写的 Caller 类型名。

⚠️ Caller.Serializer 是保护 JSON 能否反序列化的关键 —— ProtectionParser 静态 Gson 注册了 Caller.class 的适配器, 去掉注册会导致所有保护文件解析失败。

⚠️ 反射 / ASM 路径直接取目标 mod 的私有成员, 因此某个 mod 改版重命名字段后,依赖该字段的保护会静默失效或抛异常。 这是保护包需要随 mod 版本更新的根本原因。

相关条目