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 用过,这里复用以保持一致。
相关条目
- DefaultLibraries 过滤 - 第一层过滤
- DirectoryModCandidateFinder - 第二层过滤 + blackboard 来源
- CodeChickenCoreTransformer - 字节码注入位置
- 重复 mod 去重 - disabledFiles 写入方