JarByteSource 字节源

基本信息

属性 值
类 com.mitchej123.jarjar.util.JarByteSource
父类 com.google.common.io.ByteSource
字段 JarFile jar, JarEntry entry

JarByteSource 把 Guava ByteSource 适配到 JarEntry。JarJar 用它读取 access transformer / package-info.class 等 jar 内文本资源。

实现

public class JarByteSource extends ByteSource {
    private final JarFile jar;
    private final JarEntry entry;

    public JarByteSource(JarFile jar, JarEntry entry) {
        this.jar = jar;
        this.entry = entry;
    }

    @Override
    public InputStream openStream() throws IOException {
        return jar.getInputStream(entry);
    }
}

ByteSource.openStream() 返回 jar.getInputStream(entry) —— JarJar 持有 JarFile 不 close,配合 JarByteSource.asCharSource(UTF_8).read() 读取 UTF-8 文本。

使用

1. 读取 AT 文件

JarUtil.examineJarCandidate:

modAccessTransformers.put(
    String.format("%s!META-INF/%s", jar.getName(), at),
    new JarByteSource(jar, jarEntry).asCharSource(Charsets.UTF_8).read());

jarName!META-INF/<at> 是 FML AccessTransformer 接受的 key 格式。

2. 读取 package-info.class 字节

final DefaultArtifactVersion apiVersion = readApiVersion(new JarByteSource(jar, entry).read());

read() 返回 byte[],送给 ASM ClassReader 解析 @API 注解。

资源管理

JarByteSource 不负责关闭 JarFile。关闭由调用方控制 —— 一般在 try-with-resources JarFile 范围内用。

相关条目