CompatRegistry
基本信息
| 属性 | 值 |
|---|---|
| 类名 | com.gtnewhorizons.angelicacompat.asm.CompatRegistry |
| 实现接口 | CompatHandlerVisitor |
| 单例 | public static final CompatRegistry INSTANCE = new CompatRegistry(); |
| 数据结构 | 4 个 Map<String, *>(Object2ObjectOpenHashMap / Object2BooleanOpenHashMap) |
功能
AngelicaCompat 的中央字节码补丁数据注册表。它本身不修改任何字节码,只负责收集各 CompatHandler 提交的 (className → patchMap),再交给 ASM transformer 在 transform() 阶段按需读取。
收集的映射表
| 字段 | 类型 | 写入方 | 读取方 |
|---|---|---|---|
fieldLevelTessellatorTransforms |
Map<String, List<String>>(类 → 方法列表) |
CompatHandler.getFieldLevelTessellator() |
FieldLevelTessellatorTransformer |
tileEntityNullGuardTransforms |
Map<String, List<String>>(类 → 方法列表) |
CompatHandler.getTileEntityNullGuard() |
GetTileEntityNullGuardTransformer |
threadSafeISBRHAnnotations |
Map<String, Boolean>(类 → perThread 值) |
CompatHandler.getThreadSafeISBRHAnnotations() |
ThreadSafeISBRHAnnotationTransformer |
hudCachingEarlyReturns |
Map<String, List<String>>(类 → 方法列表) |
CompatHandler.getHUDCachingEarlyReturn() |
HUDCachingEarlyReturnTransformer |
装载流程
- FML 启动早期,AngelicaCompatCore 装载 AsmTransformers 列表;
- 各 transformer 在自身类加载期从
CompatRegistry.INSTANCE.<field>读取static final引用(缓存局部Map); - 当 transformer 的
transform(className, transformedName, bytes)被 LaunchWrapper 调用时,从本地Map查询目标方法是否需要补丁; - 由于 transformer 的装载先于任何 handler 注册时机——handler 注册时机由谁决定?
Handler 注册时机
CompatRegistry.register(handler) 不会被任何源码显式调用。它由 CompatHandlerVisitor.visit(CompatHandler) 间接触发——而 CompatHandler.accept(visitor) 仅在 transformer 启动时调用。
实际上:handler 是"装饰性"的——它们的 getFieldLevelTessellator() 等方法只在 transformer 装载时间接被读取。CompatHandlers.getHandlers() 的 compatHandlers 列表是惰性初始化的。
经验上
CompatRegistry的 4 个 map 实际为空——所有补丁目标通过 transformer 内硬编码的字符串与具体兼容 handler 类内ImmutableMap.of(...)一一对应。具体数据流是:handler 类加载时执行ImmutableMap.of(...),被 transformer 的static final Map patchMethods = CompatRegistry.INSTANCE.<field>读取 → 但CompatRegistry内部 4 个 map 始终为空(仅占位)。因此本类的字段主要是为未来扩展预留。
关键方法
| 方法 | 行为 |
|---|---|
register(CompatHandler) |
调 handler.accept(this) → visitor.visit(handler) → 把 handler 提供的 map 合并到本实例字段 |
visit(CompatHandler) |
读取 handler 的 4 种 map 方法,把非 null 的合并到本实例 4 个字段 |
数值
| 字段 | 默认 | 含义 |
|---|---|---|
fieldLevelTessellatorTransforms |
空 | 类 → 方法列表 |
tileEntityNullGuardTransforms |
空 | 类 → 方法列表 |
threadSafeISBRHAnnotations |
空 | 类 → perThread 布尔 |
hudCachingEarlyReturns |
空 | 类 → 方法列表 |
限制
- 字段为
Object2BooleanOpenHashMap/Object2ObjectOpenHashMap,非线程安全——注册时机必须在 transformer 装载之前完成;当前源码下未发现显式注册调用。 - 各 handler 的
ImmutableMap.of(...)内容不会进入本类的 map,因此 transform 通过硬编码字符串与 handler 类一一对应是耦合的。
第三方 mod 集成
无运行时跨 mod API。
相关条目
- CompatHandlers - 4 个 handler 的注册枚举
- AsmTransformers - 通用 transformer 装载枚举
- AngelicaCompatCore - 启动入口
- 所有 ASM transformer 条目 - 数据消费方
- 所有 CompatHandler 条目 - 数据生产方(潜在)