shared/AngelicaRedirector

基本信息

属性 值
类 com.gtnewhorizons.angelica.loading.shared.transformers.AngelicaRedirector
路径 src/main/java/com/gtnewhorizons/angelica/loading/shared/transformers/AngelicaRedirector.java
行数 13
类型 public final class,私有构造函数(:11),纯静态工厂
唯一方法 public static ModRedirector create()(:7-9)

完整实现

全部 13 行只有 2 个成员:一个 public static 工厂方法与一个私有构造函数:

// :7-9
public static ModRedirector create() {
    return new ModRedirector(AngelicaClassDump.INSTANCE, "com.gtnewhorizons.angelica.transform");
}

// :11
private AngelicaRedirector() {}

它是什么

两条加载路径的交汇点。4 个 shared/transformers/ 类中最小的一个,但被两个方向的 wrapper 共用:

调用方 行 包装类型
AngelicaRedirectorTransformer :9 IClassTransformer(LaunchWrapper)
RFBAngelicaRedirector :10 RfbModRedirector(RFB)

两边拿到的是同一个工厂方法产出的 ModRedirector 类型(实现类在 glsm 子项目)。

第二个构造参数:重定向目标包

"com.gtnewhorizons.angelica.transform" 是被重定向到的包名,不是包名前缀黑名单。含义:所有指向 LWJGL GL 类的调用,被改写为指向这个 Angelica 自己的 transform 包(即 GLStateManager 的实现层)。

这个字符串在仓库内共出现 3 次,全部是字面量重复:

出现位置 行
本类 :8
EarlyRedirectorTransformer :20(new EarlyRedirectorCore("com.gtnewhorizons.angelica.transform"))
CeleritasBlockTransform :98 getTransformerExclusions() 的第 3 项

已知问题

  1. 无 Javadoc、无注释:13 行里没有一个字的说明。"com.gtnewhorizons.angelica.transform" 的语义(重定向目标包)完全不可从本文件推断。
  2. 字面量三处重复且无共享常量:第 3 处(CeleritasBlockTransform :98)把它列为 classloader 排除项——即「不要把重定向目标包本身再重定向一遍」。这层互斥关系是正确性的关键,却没有任何注释说明;三处字符串若不同步修改,会产生无限重定向或漏重定向。
  3. AngelicaClassDump.INSTANCE 硬传入(:8):把 dump 设施与 redirector 构造耦合。ModRedirector 拿到的是共享单例,无法按 RFB/FML 路径分别配置。
  4. 私有构造函数 + final:正确的工具类写法,无继承/实例化漏洞。

相关条目