ICompatHandler(兼容处理器接口)
基本信息
| 属性 | 值 |
|---|---|
| 类 | com.gtnewhorizons.angelica.loading.fml.compat.ICompatHandler |
| 路径 | src/main/java/com/gtnewhorizons/angelica/loading/fml/compat/ICompatHandler.java |
| 行数 | 28 |
| 类型 | public interface ICompatHandler(:6) |
| 方法数 | 5,全部 default,全部默认返回 null |
它是什么
不是 transformer,也不挂在任何 FML 阶段上。它是纯数据载体:CompatHandlers 枚举提供数据,GenericCompatTransformer 在构造期把这些数据读成 4 张查表,再在类加载时按表分派给 4 个 generic/ 子 transformer。
因此它的生命周期早于任何字节码变换:数据在 coremod 阶段(AngelicaClientTweaker 构造 GenericCompatTransformer 时)就已固化。
5 个 default 方法
| 方法 | 行 | 返回类型 | 语义 | 消费方 |
|---|---|---|---|---|
getFieldLevelTessellator() |
:8-10 |
Map<String, List<String>> |
目标类 → 需要局部 Tessellator 的方法名 | FieldLevelTessellatorTransformer |
getTileEntityNullGuard() |
:12-14 |
Map<String, List<String>> |
目标类 → 需要 null 守卫的方法名 | TileEntityNullGuardTransformer |
getThreadSafeISBRHAnnotations() |
:16-18 |
Map<String, Boolean> |
目标类 → @ThreadSafeISBRH(perThread=?) |
ThreadSafeISBRHAnnotationTransformer |
getHUDCachingEarlyReturn() |
:20-22 |
Map<String, List<String>> |
目标类 → 需要 HUDCaching 早退的方法名 | HUDCachingEarlyReturnTransformer |
extraTransformers() |
:24-26 |
List<String> |
额外 transformer 类名 | CompatHandlers.getTransformers() |
全部返回 null(而非空集合)是刻意的设计:CompatHandlers.getTransformers() 用 handler.extraTransformers() != null 判空跳过,GenericCompatTransformer.registerHandler() 也用 != null 守卫后才 putAll。若返回空集合,这两处判空语义会反转。
5 个方法的覆写矩阵
| Handler | FieldLevelTessellator | TileEntityNullGuard | ThreadSafeISBRH | HUDCachingEarlyReturn | extraTransformers |
|---|---|---|---|---|---|
| StacksOnStacks | ✔ | ✔ | ✔ | — | ✔ |
| ImmersiveEngineering | — | ✔ | ✔ | — | ✔ |
| ExtraUtils | — | — | ✔ | — | — |
| Thaumcraft | — | — | — | ✔ | — |
| ThaumicHorizons | — | — | — | ✔ | — |
getThreadSafeISBRHAnnotations() 是唯一 3 个 handler 都覆写的方法,也是唯一一个可以「多 handler 覆盖同一目标类」而不冲突的表——GenericCompatTransformer 对 4 张表都做 putAll,而 5 个 handler 的目标类名互不重叠。
已知问题
接口没有任何契约文档(无类级 Javadoc),且 extraTransformers() 返回的是完全限定字符串而不是 Class<?>,拼写错误只能在运行期以 ClassNotFoundException 暴露。相比之下 api/ThreadSafeISBRH 等对外 API 都有完整 Javadoc —— 本接口是内部实现细节,未做对外文档化。
相关条目
- CompatHandlers - 5 个枚举项,接口的唯一实现集合
- GenericCompatTransformer - 把接口数据变成 4 张查表的消费者
- FML Transformers - 4 个
generic/子 transformer 的分派关系 - CompatConfig - 决定 5 个 handler 中哪几个生效