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 启动参数在类初始化前设定。
已知问题
private隐式构造函数 + 无状态:类只能被当作静态门面,不能继承、不能注入测试替身。INSTANCE命名误导:它不是「Angelica 的实例」,而是 glsmClassDump的单例,字段名未体现委托关系。- dump 不覆盖全部 transformer(见上表):redirector 三兄弟的变换结果不在本仓库的 dump 覆盖范围内。用户用
-Dangelica.dumpClass排查 GL 重定向问题时可能拿不到数据。 dumpClass与dumpRFBClass签名不对称:前者收byte[] original+byte[] transformed,后者收ClassNodeHandle(变换后的节点,无 original 字节对)。两条路径的 dump 产物格式不一致,无法用同一工具直接对比。- 跨子项目依赖:本类同时 import
SystemProperties(glsm)与ClassDump(glsm),却位于主源码树loading/shared/—— 正是shared/package-info警告的情形(见 shared/package-info)。
相关条目
- shared/package-info - 本类所在包的双加载器约束
- CeleritasBlockTransform -
INSTANCE传入ModRedirector构造 - SystemProperties -
DUMP_CLASS开关 - Subprojects(内嵌子项目) -
ClassDump的实际实现所在 - AngelicaRfbPlugin - RFB 侧的 dump 触发链