12 个版本 (6 个重大变更)
0.7.1 | 2024年7月31日 |
---|---|
0.6.1 | 2022年12月11日 |
0.6.0 | 2022年8月7日 |
0.5.0 | 2021年10月28日 |
0.4.1 | 2021年6月26日 |
#412 在 解析器实现
每月261次下载
用于 2 crates
175KB
4.5K SLoC
cafebabe
cafebabe 是一个用于解析 .class
文件的解析器,这些文件由 javac 编译器和其他针对 JVM 的编译器生成。它支持从 Java 21(2023年9月)开始的类文件格式。
crates.io 上有各种不同的类文件解析器。cafebabe 的主要不同之处在于
- 支持 Java 21。
- 更好的用户 API。大多数其他解析器暴露了常量池的原始 u16 值,这意味着你必须作为用户负责进行常量池查找。这也意味着你必须进行类型验证(例如,确保你正在读取的常量池条目实际上是一个 classinfo 类型,或者任何其他类型)。
cafebabe
在内部执行所有这些操作,并返回在执行常量池查找后得到的“原始”类型。考虑读取 classinfo 成员的示例。在大多数其他解析器中,你会从解析器中得到一个 u16,你必须:(a)进行常量池查找,(b)验证它是否是 classinfo 类型,(c)从 classinfo 中提取 u16,(d)进行另一个常量池查找,(e)验证它是否是 utf8 类型,(f)读取字符串。在cafebabe
中,你只需直接得到字符串,因为在解析阶段已经完成了所有类型检查和查找。 - 字符串数据零拷贝。所有字符串都作为
Cow<'a, str>
返回,这些与你的输入类字节的生命周期相关联。这意味着在cafebabe
中,除了在非常罕见的情况下(一个字符串位于非标准 utf-8 的“java utf-8”子集中),字符串在任何地方都不会进行零拷贝。 - 最小依赖。该 crate 只有几个依赖项,而且其中任何一个都没有引入任何传递依赖。
当前状态
主要的解析代码已经完全实现。支持在JVM规范的第4章中描述的所有结构(包括属性)。OpenJDK 16/17/21分布的整个modules
文件可以无错误地解析。cafebabe
在解析时会进行某些类型的验证/检查,但不是JVM规范第4章中描述的所有内容。它执行了4.8节中的所有验证(格式检查),除了可能的一些属性验证(例如签名属性)。这个项目的合理目标是完全实现4.8节,因此会接受额外的格式检查补丁。
问答
为什么这个项目叫做cafebabe
?
因为任何有效的类文件的前4个字节是一个具有值0xCAFEBABE的魔法标识符。☕
依赖关系
~125KB