DefaultImplementationTransformer
基本信息
| 属性 | 值 |
|---|---|
| 类全名 | codechicken.core.asm.DefaultImplementationTransformer |
| 实现接口 | net.minecraft.launchwrapper.IClassTransformer |
| 配套注解 | codechicken.core.asm.InterfaceDependancies(空标记注解) |
| 本仓内调用方 | 0 个 |
功能
这是留给其他模组使用的 coremod 扩展点:让一个类自动获得某个接口的默认方法实现,语义上等价于 Java 8 的接口默认方法,但在 1.7.10(Java 6/7 语法基线)上通过字节码注入实现。
外部模组只需调用:
DefaultImplementationTransformer.registerDefaultImpl("某接口全名", "含实现的类全名");
registerDefaultImpl(String iname, String cname)(DefaultImplementationTransformer.java:23-30)在首次调用时才把转换器注册进类加载器——用 impls.isEmpty() 作守卫,只注册一次,随后把 InterfaceImpl 存入 HashMap<String, InterfaceImpl>。
变换逻辑
transform()(:32-43)对每个类:
- 若
transformedName以net.minecraft开头,或impls为空 → 原样返回(:34)。即:它只改非原版类 - 反序列化出
ClassNode(:35) - 遍历该类实现的接口,逐个查表(
:36-38) - 有改动才重新序列化返回(
:42)
InterfaceImpl 内部类(:45-...)在构造时:
- 读接口方法名集合(
:52-53) - 遍历实现类,只挑签名匹配的方法,并把描述符经
ObfMapping.toRuntime().s_desc转成运行时名(:55-58)
patch()(:63-...)为缺失签名的方法补一份拷贝并加入目标类(:74-84)。
重要事实:这是未被本模组使用的 API
registerDefaultImpl 在 CodeChickenCore 全仓内的命中点只有它自己的定义处(grep -rn 'registerDefaultImpl' --include='*.java' src/ 仅 1 行)。@InterfaceDependancies 注解同样在本仓内零使用(除其自身定义外无命中),MethodASMifier 也无任何调用方。
因此:
- 它不是本模组运行时会加载的转换器
- 它是随 jar 分发、供外部模组调用的 API
- 按「死代码 ≠ 注册内容」的口径,本条目不把它计入本模组的活跃注册内容
代码细节:
patch()在:83处构造了MethodNode copy并调用ASMHelper.copy(impl, copy),但随后加入类的是impl而非copy(:84cnode.methods.add(impl))。此处copy未被使用。这是源码事实记录,本条目不对其正确性下结论(未运行该路径)。
相关条目
- CodeChickenCorePlugin - 唯一无条件注册两个转换器的 coremod 入口
- ASM 工具包 -
ASMHelper、ObfMapping的所在包