11 个不稳定版本
0.6.1 | 2024 年 6 月 14 日 |
---|---|
0.5.0 | 2022 年 5 月 8 日 |
0.4.0-alpha.3 | 2020 年 4 月 5 日 |
0.4.0-alpha.2 | 2020 年 1 月 1 日 |
0.3.0 | 2019 年 9 月 14 日 |
#439 在 解析器实现 中
每月 28 次下载
在 2 个 crate 中使用 (通过 droid-wrap-utils)
340KB
9K SLoC
Noak
一个用于读取和写入 Java 类文件的库。
示例
use noak::reader::Class;
let mut class = Class::new(&bytes)?;
println!("Major Version: {}", class.version().major);
println!(" Access Flags: {:?}", class.access_flags()?);
println!(" Class Name: {}", class.this_class_name()?.display()?);
为什么你应该使用 noak?
- 读取
- 你希望在解析类文件时不丢失信息。
- 你不想解析整个类文件。
- Noak 接受所有有效的类文件。许多无效的类文件也被接受(这可能对读取高度混淆的代码很有用)。
- 写入
- 你想要编写自己的类文件(适用限制;见下文)。
为什么你不使用 noak?
这些问题中的许多正在解决过程中,但这可能需要一些时间。
- 你想要的不仅仅是低级的类文件读取器和写入器。
- Noak 严重依赖类型系统和宏。这可能会导致你的 IDE 出现问题或使某些方面难以理解。
- 文档几乎不存在。
- API 非常不稳定。
- 代码测试不足。
- 读取
- 某些代码可能重复(例如,从常量池检索值)。
- 写入
- 修改现有的类文件可能非常繁琐。
- 目前无法写入所有属性(相关问题)
- 超过 65535 字节的可能无法写入。
- 构建器 API 对你的用例不够灵活。
- 自定义错误非常有限。
- Stack Map Frames 不会自动生成。
替代方案
这不是一个详尽的列表。以下声明可能不准确反映现实。
用 Rust 编写的库
- cafebabe
- 一次性解析整个文件。
- 在解析过程中访问常量池。不需要用户显式检索。
- classreader-rs
- 一次性解析整个文件。
- 仅支持解析。
- 不支持版本 53.0 及以上版本的任何属性。
- 不解析包含未配对代理的字符串。
- jbcrs
- 一次性解析整个文件。
- 仅支持解析。
- 不支持版本 53.0 及以上版本的任何属性。
- 不解析包含未配对代理的 UTF-8 常量的文件。
- frappe/classfile
- 一次性解析整个文件。
- 仅支持解析。
- 不支持版本 53.0 及以上版本的任何属性。
- 不解析包含代理的 UTF-8 常量的文件。
- classfile-rs
- 看起来非常不完整。
- 支持解析和写入。
- 一次性解析整个文件。
- 以有损方式读取 UTF-8 常量。
- classfile-parser
- 看起来非常不完整。
- 一次性解析整个文件。
- 仅支持解析。
- classfmt
- 看起来非常不完整。
- 一次性解析整个文件。
- 仅支持解析。
- javabc
- 看起来非常不完整。
- 一次性解析整个文件。
- 仅支持解析。
非 Rust 编写的库的一小部分
- ASM (Java)
- 最全面且支持最好的类文件操作和分析框架。
- 如果noak不能满足您的需求,甚至如果它满足您的需求,也可以使用此框架。
- javassist (Java)
- 高级字节码库。
- BCEL (Java)
许可证
本项目采用MIT许可证。
依赖项
~1MB
~19K SLoC