AngelicaClassDump(变换前后字节码落盘)

基本信息

属性 值
类 com.gtnewhorizons.angelica.loading.shared.AngelicaClassDump
路径 src/main/java/com/gtnewhorizons/angelica/loading/shared/AngelicaClassDump.java
行数 18
类型 public class(:7),无构造函数(纯静态门面)
委托 com.gtnewhorizons.angelica.glsm.loading.ClassDump(glsm 子项目)

它是什么

7 个「两条路径共用」的类之一。不是 transformer,是 transformer 的审计/调试出口。整个类只有 1 个字段 + 2 个静态方法:

成员 行 签名
INSTANCE :9 new ClassDump(SystemProperties.DUMP_CLASS)
dumpClass(...) :11-13 FML 侧:入参 (String, byte[] original, byte[] transformed, Object transformer)
dumpRFBClass(...) :15-17 RFB 侧:入参 (String, ClassNodeHandle, Object transformer)

挂在哪个阶段

不挂任何阶段。它是被 transformer 在完成一次成功变换后主动调用的。按调用点集合运算,全仓共 6 个调用点:

调用方 行 形式
CeleritasBlockTransformer :56 dumpClass
IsbrhTessellatorAbuseTransformer :28 dumpClass
GenericCompatTransformer :79 dumpClass
StacksOnStacksTransformer :54 dumpClass
ImmersiveEngineeringTransformer :64 dumpClass
RFBCeleritasBlockTransformer :90 dumpRFBClass
RFBIsbrhTessellatorAbuseTransformer :57 dumpRFBClass

(7 个调用点。其中 FieldLevelTessellatorTransformer 等 4 个 generic/ 静态工具不 dump —— 它们由 GenericCompatTransformer 统一 dump。)

不 dump 的 transformer:AngelicaRedirectorTransformer、EarlyRedirectorTransformer、RFBAngelicaRedirector —— 三者都把控制权完全交给 glsm 子项目的 ModRedirector / EarlyRedirectorCore,dump 行为由那些类自己决定(在本仓库范围内不可见)。

开关

:9 的 SystemProperties.DUMP_CLASS 是 static final,在类初始化时求值一次。物理文件位于 glsm 子项目:glsm/src/main/java/com/gtnewhorizons/angelica/config/SystemProperties.java(主源码树下无同名文件)。见 SystemProperties。

因为是 static final,运行期无法开关 dump —— 只能靠 JVM 启动参数在类初始化前设定。

已知问题

  1. private 隐式构造函数 + 无状态:类只能被当作静态门面,不能继承、不能注入测试替身。
  2. INSTANCE 命名误导:它不是「Angelica 的实例」,而是 glsm ClassDump 的单例,字段名未体现委托关系。
  3. dump 不覆盖全部 transformer(见上表):redirector 三兄弟的变换结果不在本仓库的 dump 覆盖范围内。用户用 -Dangelica.dumpClass 排查 GL 重定向问题时可能拿不到数据。
  4. dumpClass 与 dumpRFBClass 签名不对称:前者收 byte[] original + byte[] transformed,后者收 ClassNodeHandle(变换后的节点,无 original 字节对)。两条路径的 dump 产物格式不一致,无法用同一工具直接对比。
  5. 跨子项目依赖:本类同时 import SystemProperties(glsm)与 ClassDump(glsm),却位于主源码树 loading/shared/ —— 正是 shared/package-info 警告的情形(见 shared/package-info)。

相关条目