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

装载流程

  1. FML 启动早期,AngelicaCompatCore 装载 AsmTransformers 列表;
  2. 各 transformer 在自身类加载期从 CompatRegistry.INSTANCE.<field> 读取 static final 引用(缓存局部 Map);
  3. 当 transformer 的 transform(className, transformedName, bytes) 被 LaunchWrapper 调用时,从本地 Map 查询目标方法是否需要补丁;
  4. 由于 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。

相关条目