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解析器实现

Download history 29/week @ 2024-04-29 96/week @ 2024-05-06 48/week @ 2024-05-13 42/week @ 2024-05-20 6/week @ 2024-05-27 28/week @ 2024-06-03 22/week @ 2024-06-10 58/week @ 2024-06-17 164/week @ 2024-06-24 26/week @ 2024-07-01 27/week @ 2024-07-08 20/week @ 2024-07-15 46/week @ 2024-07-22 155/week @ 2024-07-29 23/week @ 2024-08-05 32/week @ 2024-08-12

每月261次下载
用于 2 crates

0BSD 许可

175KB
4.5K SLoC

cafebabe

Build Status Crate

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