RFB 字节码转换器

基本信息

属性 值
转换器数量 4
注册位置 Lwjgl3ifyRfbPlugin.makeTransformers()
实现接口 com.gtnewhorizons.retrofuturabootstrap.api.RfbClassTransformer
ASM 版本 9.10.1(gradle/libs.versions.toml:3)
FML 传统 ASM 转换器 0(Lwjgl3ifyCoremod.java:46 返回空数组)

这是 LWJGL3ify 最主要的"内容":它不添加方块或物品,而是改写字节码。4 个转换器全部由 RFB 在 class 加载前调用。

功能

1. LwjglRedirectTransformer(id redirect)

src/main/java/me/eigenraven/lwjgl3ify/rfb/transformers/LwjglRedirectTransformer.java

把 LWJGL2 / 已从新 JDK 移除的 API 调用重定向到替代实现。它继承 ASM 的 Remapper(:29),用字节模式匹配(BytePatternMatcher.Mode.Contains)快速跳过无关类(:42-44)。

6 组前缀重定向(:35-40,fromPrefixes → toPrefixes 一一对应):

源前缀 目标前缀
org/lwjgl/ org/lwjglx/
javax/xml/bind/ jakarta/xml/bind/
java/util/jar/Pack200 me/eigenraven/lwjgl3ify/redirects/Pack200
jdk/nashorn/ org/openjdk/nashorn/
com/mumfrey/liteloader/launch/ClassPathUtilities me/eigenraven/lwjgl3ify/redirects/LiteLoaderClassPathUtilities
javax/activity/InvalidActivityException me/eigenraven/lwjgl3ify/redirects/InvalidActivityException

关键行为:

  • sortAfter() 返回 {"*", "mixin:mixin"}(:47-49)—— 必须排在所有其他转换器之后。
  • additionalExclusions() 把 12 个前缀中的 / 换成 . 后全部排除,避免递归(:58-62)。
  • 支持通过 jar manifest 属性 Lwjgl3ify-Aware 整体跳过本转换器(:31-32)。类级跳过则用 @Lwjgl3Aware 注解,命中时抛 Lwjgl3AwareException 并 return false(:104-105)。
  • 转换失败走 catch (Exception e),打 "Couldn't remap class {}" warn 后 return false(:106-108)—— 该类保持未转换状态继续加载,属静默降级。

2. ExtensibleEnumTransformer(id extensible-enum)

ExtensibleEnumTransformer.java:31

为枚举生成"可扩展"能力,取代 Forge EnumHelper 的一整套调用。设计上来自 Forge 1.19.3(README “How does it work?” 章节注明为 LGPL 复制)。

  • 对标注 @MakeEnumExtensible(MARKER_ANNOTATION,:37)或已实现 IExtensibleEnum(MARKER_IFACE,:36)的类生效。
  • 生成的动态方法名为 dynamicCreate(CREATE_METHOD_NAME,:49)。
  • 通过 ASM 插入常量池与 LDC 调用(:306 的 ins.visitLdcInsn(classType))。
  • 依赖 org.apache.commons.lang3.ArrayUtils 与 me.eigenraven.lwjgl3ify.UnsafeHacks,但二者以字符串常量形式通过 Type.getType("L...;") 构造,源码注释明确说明"不要直接引用以避免类加载"(:38-45)。

配套的 LWJGL3ify 侧实现是 me.eigenraven.lwjgl3ify.EnumHelper(EnumHelper.java:34)与接口 IExtensibleEnum。默认可扩展枚举清单见 早期配置 JSON。

3. UnfinalizeObjectHoldersTransformer(id unfinalize-object-holders)

UnfinalizeObjectHoldersTransformer.java:27

取消 FML ObjectHolder / ItemStackHolder 字段的 final 修饰,使其他转换器能改写其值。

  • 目标 4 个内部类(OBJECT_HOLDERS,:29-34):GameRegistry$ObjectHolder、GameRegistry$ItemStackHolder、GameRegistry/ObjectHolder、GameRegistry/ItemStackHolder(两种二进制内部类命名形式都覆盖)。
  • shouldTransformClass 显式对 net.minecraft.init.Blocks 与 net.minecraft.init.Items 返回 true(:53-55)。
  • 其余情况用 BytePatternMatcher.Mode.Equals 比对类头字节(:36-38、:57-58)。
  • 命中时给字段追加 @WasFinalObjectHolder 注解(:82)作为标记。

4. ForgePatchTransformer

ForgePatchTransformer.java:29

定点重写 5 个 FML/Forge 内部类(PATCHED_CLASSES,:44-45):

常量 全限定名 改写方法
CLASS_PATCH_MANAGER cpw.mods.fml.common.patcher.ClassPatchManager tfClassPatchManager(:76)
TRACING_PRINT_STREAM cpw.mods.fml.common.TracingPrintStream tfTracingPrintStream(:113)
FML_SECURITY_MANAGER cpw.mods.fml.relauncher.FMLSecurityManager tfFmlSecurityManager(:167)
ENUM_HELPER net.minecraftforge.common.util.EnumHelper tfEnumHelper(:208)
PROGRESS_BAR cpw.mods.fml.common.ProgressManager$ProgressBar tfProgressBar(:250)

其中:

  • tfClassPatchManager 把 JarInputStream 的 owner 改写为 me/eigenraven/lwjgl3ify/redirects/JarInputStream(:106)—— 因为 java.util.jar.JarInputStream 在新 JDK 上不再接受含 jar: 协议 URL 的流。
  • tfProgressBar 注入 me/eigenraven/lwjgl3ify/redirects/ProgressBar(:280)。
  • 每个 tf* 方法在类数据缺失时打 logger.error("... missing class data")(:80,118,171,212,255)。

数值

数值 值 来源
转换器总数 4 Lwjgl3ifyRfbPlugin.java:53-54
redirect 前缀对数 6 LwjglRedirectTransformer.java:35-40
redirect 转换器 id redirect LwjglRedirectTransformer.java:53-55
extensible-enum 转换器 id extensible-enum ExtensibleEnumTransformer.java:51-54
unfinalize 转换器 id unfinalize-object-holders UnfinalizeObjectHoldersTransformer.java:41-43
ObjectHolder 目标类数 4 UnfinalizeObjectHoldersTransformer.java:30-34
Forge 定点改写类数 5 ForgePatchTransformer.java:44-45
dynamicCreate 生成方法名 dynamicCreate ExtensibleEnumTransformer.java:49
manifest 跳过属性 Lwjgl3ify-Aware LwjglRedirectTransformer.java:31-32

交互

触发 行为
类加载且字节含 org/lwjgl/ 等 6 前缀之一 重定向到 LWJGL3 / 替代包;org.lwjgl. 与 org.lwjglx. 已被排除不会递归
加载带 Lwjgl3ify-Aware manifest 属性的 jar 跳过 redirect 转换器
加载 @Lwjgl3Aware 标注的类 跳过该类的 redirect
加载 @MakeEnumExtensible 枚举 生成 dynamicCreate 扩展方法
重定向过程抛非 Lwjgl3AwareException 异常 打 warn,该类不转换并继续加载

相关条目