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