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,非客户端专用)

相关条目