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 版本更新的根本原因。
相关条目
- Condition - 消费 Getter 的求值器
- Segment - 规则段
- ProtectionParser - 注册
Caller.Serializer