FML Java 9+ 兼容补丁
基本信息
| 属性 | 值 |
|---|---|
| Mixins 条目 | Mixins.FORGE_JAVA9 |
| 条目描述 | "FML Java 9+ compatibility patch" |
| 阶段 | EARLY(Mixins.java:86 默认构造) |
| 目标模组条件 | 无(addCommonMixins,不限定 mod) |
| 包含的 mixin 类 | 4 |
| 注册位置 | Mixins.java:13-19 |
FORGE_JAVA9 是 Mixins 枚举中唯一使用 addCommonMixins(...) 的条目(其余 11 个条目均用 addClientMixins(...)),即它的 4 个补丁在客户端与服务端都生效。
功能
FORGE_JAVA9 处理 FML 1.7.10 在 Java 9+ 上因反射访问受限而崩溃的路径。它面向 4 个类,全部 remap = false(都属 FML 而非 Minecraft 命名空间,重映射无意义):
| mixin 类 | 目标 | 声明位置 |
|---|---|---|
fml.ItemStackHolderRef |
cpw.mods.fml.common.registry.ItemStackHolderRef |
early/fml/ItemStackHolderRef.java 的 @Mixin(targets = {...}, remap = false) |
fml.JarDiscoverer |
cpw.mods.fml.common.discovery.JarDiscoverer |
early/fml/JarDiscoverer.java 的 @Mixin(value = {...}, remap = false) |
fml.ObjectHolderRef |
cpw.mods.fml.common.registry.ObjectHolderRef |
early/fml/ObjectHolderRef.java 的 @Mixin(targets = {...}, remap = false) |
fml.ObjectHolderRegistry |
cpw.mods.fml.common.registry.ObjectHolderRegistry |
early/fml/ObjectHolderRegistry.java 的 @Mixin(value = {...}, remap = false) |
JarDiscoverer 与 ObjectHolderRegistry 使用 @Mixin(value = <Class>.class, ...) 形式——它们的 FML 依赖在编译期可见;ItemStackHolderRef 与 ObjectHolderRef 则用 @Mixin(targets = {"字符串"}) 形式。
ObjectHolderRegistry 使用 @Redirect 注入,JarDiscoverer 同样使用 @Redirect 替换 FML 内部的 mod 发现逻辑。
数值
| 数值 | 值 | 来源 |
|---|---|---|
| 目标 FML 类数 | 4 | Mixins.java:16-19 |
remap = false 的 mixin 数 |
4(本条目全部) | 各文件 @Mixin 注解 |
catch (Throwable e) 吞异常点 |
2(ObjectHolderRef.java:79、ItemStackHolderRef.java:69) |
见下 |
已知静默失败点
本条目的两个 Holder 补丁都把字段写入失败降级为日志,属已确认的静默失败:
ObjectHolderRef.java:79-81:catch (Throwable e)只FMLLog.log(Level.WARN, ...)。字段写不进去时,对应@ObjectHolder注入的方块/物品保持 null,游戏继续运行但该注册项缺失。同文件:70-74还有一处"查不到就 return"的提前退出,注释明说多半是 mod 配置项而非真实注册。ItemStackHolderRef.java:69-78:catch (Throwable e)同样只打 WARN。相比之下同文件:54-65的另一处 catch 会throw e重抛——即同一文件内两种策略并存。
ObjectHolderRef.java:41 与 ItemStackHolderRef.java:40 各有一个 catch (Exception e),同样降级处理。
交互
| 触发 | 行为 |
|---|---|
| FML 反射写入 Holder 字段失败 | 打 WARN,字段保持原值,游戏继续 |
| Holder 目标对象未注册 | 查表失败,DEBUG 级日志后跳过(视为 mod 配置项) |
| 服务端启动 | 生效(addCommonMixins,非客户端专用) |
相关条目
- Mixin 注册机制总览 -
Mixins枚举 12 条目与空 JSON 数组的关系 - RFB 字节码转换器 -
UnfinalizeObjectHoldersTransformer取消 Holder 字段 final,与本条目配合