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,该类不转换并继续加载 |
相关条目
- RetroFuturaBootstrap 加载插件 - 4 个转换器的注册处
- LWJGL2→LWJGL3 兼容层 - redirect 转换器的目标代码
- 早期配置 JSON - 可扩展枚举清单
- 可扩展枚举 API -
@MakeEnumExtensible与ConfigUtils