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)对每个类:

  1. 若 transformedName 以 net.minecraft 开头,或 impls 为空 → 原样返回(:34)。即:它只改非原版类
  2. 反序列化出 ClassNode(:35)
  3. 遍历该类实现的接口,逐个查表(:36-38)
  4. 有改动才重新序列化返回(: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(:84 cnode.methods.add(impl))。此处 copy 未被使用。这是源码事实记录,本条目不对其正确性下结论(未运行该路径)。

相关条目