fml/tweakers/package-info(ITweaker 独立包约束)
基本信息
| 属性 | 值 |
|---|---|
| 文件 | src/main/java/com/gtnewhorizons/angelica/loading/fml/tweakers/package-info.java |
| 行数 | 11 |
| 声明包 | com.gtnewhorizons.angelica.loading.fml.tweakers |
| 性质 | 不是类 —— 只有 Javadoc + package 声明 |
| 包内文件 | 5 个:4 个 ITweaker + 本 package-info |
唯一内容(:1-11)
整个文件就是一段 9 行 Javadoc 加一行 package 声明,没有任何 import、注解或类型定义:
/**
* ITweaker needs to be in a standalone package
* because FML adds the whole package to the class
* loader exclusions and that causes really hard to
* find bugs. ITweakers also get class loaded
* by the parent class loader and not LaunchClassLoader,
* as a result the ITweakers should not reference any
* class otherwise it will load them (maybe a second time)
* on the parent class loader.
*/
package com.gtnewhorizons.angelica.loading.fml.tweakers;
两个独立约束
| # | 约束 | 后果 |
|---|---|---|
| 1 | ITweaker 必须独占一个包 | 因为 FML 会把整个包加进 classloader 排除项 —— 同包的其它类会被一并排除,导致「极难排查」的故障 |
| 2 | ITweaker 由父类加载器加载,不是 LaunchClassLoader |
因此 ITweaker 引用任何其它类都会让那些类在父加载器上被加载(可能是第二次) |
约束 2 的直接后果就是 AngelicaClientTweaker 构造函数手工注册 3 个排除前缀(:50-54),其中就包括 com.gtnewhorizons.angelica.loading —— 而本包路径 com.gtnewhorizons.angelica.loading.fml.tweakers 正在其下。这是刻意的:把 ITweaker 排除在自己的 classloader 可见范围外,正是约束 1 的目的。
包内 4 个 ITweaker 的遵守情况
| 类 | 依赖的包外类 | 风险 |
|---|---|---|
| AngelicaLateTweaker | TransformerNarrower、EcosystemNarrowRules、LaunchClassLoader、FML 日志 |
通过反射访问(narrowTransformerExclusions 反射取 transformerExceptions) |
| CeleritasLateTweaker | 同上模式 | 反射 |
| IncompatibleModsDisablerTweaker | CoreModManager、MixinPlatformManager、IContainerHandle、MixinContainer |
全反射 + cpw.mods.* / Mixin 类型 |
| XaerosTransformerDisablerTweaker | LaunchClassLoader、FML 日志 |
反射 |
4 个类全部用反射访问目标类型(getDeclaredField + setAccessible),这是对约束 2 的正面遵守:反射不需要在编译期硬引用,从而避免「在父加载器上二次加载」。
已知问题
- 约束 1 与实际包结构存在张力:
AngelicaClientTweaker:52排除的是com.gtnewhorizons.angelica.loading(上两级),范围远大于fml.tweakers单包。也就是说「独占一个包」在本仓库里没有严格实现 ——fml/tweakers/与fml/compat/、fml/transformers/同在fml/下。 - 注释里的因果关系不完整:「needs to be in a standalone package because FML adds the whole package to exclusions」——但真正触发整包排除的是 AngelicaClientTweaker
:52那行手写字符串。若有人修改该前缀,package-info的约束就自动失效,而没有任何测试或断言会发现。 - 无英文以外的说明(对比仓库其它注释风格一致),本文件是纯英文技术约束说明,无问题。
- 11 行 Javadoc 全部挤在一行段落里,无
@see指向 4 个 ITweaker。
相关条目
- shared/package-info - 另一条包级约束(双加载器中立)
- Late Tweakers - 本包 4 个 ITweaker 的成文条目
- AngelicaClientTweaker -
:50-54手工排除项的来源 - AngelicaTweaker - ITweaker 层的入口外壳