#java-class #class #java #bytecode #jvm #file-reader

noak

一个用于读取和写入 Java 类文件的库

11 个不稳定版本

0.6.1 2024 年 6 月 14 日
0.5.0 2022 年 5 月 8 日
0.4.0-alpha.32020 年 4 月 5 日
0.4.0-alpha.22020 年 1 月 1 日
0.3.0 2019 年 9 月 14 日

#439解析器实现

每月 28 次下载
2 个 crate 中使用 (通过 droid-wrap-utils)

MIT/Apache

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