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 范围内用。
相关条目
- JarUtil 嵌套抽取与版本识别 - 主要消费方