ASMRemapperTransformer

基本信息

属性 值
类名 io.github.legacymoddingmc.unimixins.compat.asm.ASMRemapperTransformer
文件 module-compat/src/main/java/…/compat/asm/ASMRemapperTransformer.java
行数 185
接口 IClassTransformer
开关 enableRemapper(默认 true)
启用版本 Minecraft 1.7.10

功能

ASM 包名适配层。类注释:

The ASM package name used by Mixin differs between mixin loaders. This transformer remaps references to ASM to use the correct package name for the current runtime environment, allowing mods to work regardless of what mixin loader they were compiled against.

即:同一个 mod,无论针对哪种 mixin loader 编译,都能在当前运行环境下正确引用 ASM。

三个包名常量

private static final String ASM_PACKAGE_UNSHADED = "org/objectweb/asm/";
private static final String ASM_PACKAGE_LEGACY    = "org/spongepowered/asm/lib/";
private static final String ASM_PACKAGE_MBL       = "org/spongepowered/libraries/org/objectweb/asm/";

重映射规则(源码注释原文)

源包名 归属 mixin loader 作用范围
org.spongepowered.libraries.org.objectweb.asm MixinBooterLegacy、GTNHMixins 所有类
org.spongepowered.asm.lib Mixin 0.7、GasStation、UniMixins 所有类
org.objectweb.asm Mixin 0.8 仅实现 IMixinConfigPlugin 或标注 @RemapASMForMixin 的类

实现要点

⚠️ org.objectweb.asm(Mixin 0.8)这条规则有范围限制 —— 只对实现 IMixinConfigPlugin 或带 RemapASMForMixin 注解的类生效。 另两条是「所有类」无条件生效。三条规则不对等,容易误以为统一处理。

⚠️ 它是全仓注册最早的 transformer。与其它 3 个不同, 它不在 getASMTransformerClass() 里,而是在 CompatCore 构造器中经 Launch.classLoader.registerTransformer(...) 注册。 源码注释:

We register the transformer this way to register it as early as possible.

即它必须早于 ASM 转换阶段本身,否则无法修正后续 transformer 的引用。

⚠️ 内部还有一个相对类名辅助:CompatCore.relativeClassName("asm.ASMRemapperTransformer") —— 拼接 CompatCore 的包名 + 相对路径得到全限定名, 目的是在模块被 relocate 后仍能定位到本类。

相关条目