ClassSplicingUtil
基本信息
pl.asie.foamfix.coremod.util.ClassSplicingUtil —— 把一个独立的 Inject 类
的字节码拼接进目标类,使注入逻辑以本 mod 包名编译、
却能操作目标类的私有成员。
调用方
5 个补丁用它做注入:
| 补丁 | 注入体 FQN |
|---|---|
| LinuxGuiChatBrowsePatch | pl.asie.foamfix.coremod.injects.client.LinuxGuiChatBrowseInject |
| EntityHeldItemNBT Render Fix | pl.asie.foamfix.forkage.coremod.injects.EntityLivingBaseItemNBTRenderFixInject |
| TessellatorAlphaPassCrashFix | pl.asie.foamfix.forkage.coremod.injects.TessellatorAlphaPassWrapFixInject |
调用形式:
successful = ClassSplicingUtil.spliceClasses(classNode, "<Inject FQN>", false, ...);
⚠️ 斜杠→点转换(两处)
第 77 行与第 179 行都有:
final String targetClassName = targetClassName2.replace('/', '.');
与方法级修补走的是同一类转换;与 Abstract Patcher 第 48 行同源。
为什么需要拼接
注入体若是独立编译的类,直接调用目标类的私有方法/字段会因
Java 访问控制失败。拼接进目标类的 ClassNode 后,
注入代码与目标共享一个类作用域,私有访问成立。
拼接类位于
pl.asie.foamfix包下,被 FoamFix Core 的@IFMLLoadingPlugin.TransformerExclusions排除,不会被再次改写。
相关条目
源码
src/main/java/pl/asie/foamfix/coremod/util/ClassSplicingUtil.java