Hooks 跨 transformer 钩子

基本信息

属性 值
类 com.mitchej123.jarjar.util.Hooks
用途 给第三方 transformer 提供"JarJar 是否已处理过该 jar"的统一入口

Hooks.shouldIgnore(File) 把"默认库 + JarJar 标记的 disabled"两条规则收拢到一个方法,供 CodeChickenCoreTransformer 等字节码 transformer 调用。

实现

@SuppressWarnings("unused")
public class Hooks {
    public static boolean shouldIgnore(File file) {
        return DefaultLibraries.isDefaultLibrary(file) || DirectoryModCandidateFinder.getDisabledFiles().contains(file.getName());
    }
}

两条规则:

来源 行为
DefaultLibraries.isDefaultLibrary(file) 文件名匹配 42 个前缀 → 是默认库
DirectoryModCandidateFinder.getDisabledFiles() 包含 file basename → 已被 JarJar 标记 disabled

调用点

CodeChickenCoreTransformer.transformClass 在 findClasspathMods 字节码里插入 INVOKESTATIC Hooks.shouldIgnore:

mn.instructions.insertBefore(insn,
    new MethodInsnNode(Opcodes.INVOKESTATIC, "com/mitchej123/jarjar/util/Hooks", "shouldIgnore", "(Ljava/io/File;)Z", false));
mn.instructions.insertBefore(insn, new JumpInsnNode(Opcodes.IFEQ, ifneJumpLabel));

效果:

if (!knownLibraries.contains(file.getName()) && !Hooks.shouldIgnore(file)) {
    // 加入 candidate
}

设计意图

把"已知库"和"已禁用"统一成一个 bool 表达式 —— transformer 作者只需调 shouldIgnore 即可同时享受两层过滤。DefaultLibraries 已在 ClasspathModCandidateFinder 用过,这里复用以保持一致。

相关条目