#class #java #parser #virtual-machine

classreader

A Rust 库,用于读取、写入和解析 Java 虚拟机类文件

3 个不稳定版本

使用旧的 Rust 2015

0.2.1 2018 年 6 月 17 日
0.2.0 2015 年 7 月 28 日
0.1.0 2015 年 7 月 24 日

#2457 in 解析器实现

Apache-2.0

79KB
1.5K SLoC

classreader

解析 Java 虚拟机 8 版本使用的 类文件格式

概要

extern crate classreader;

use classreader::ClassReader;
use std::fs::File;

pub fn main() {
    let mut file = File::open("pkg/Test.class").unwrap();
    let class = ClassReader::new_from_reader(file).unwrap();

    assert_eq!(0xCAFEBABE, class.magic);
}

classreader 使用 log crate 输出一些日志信息。这些信息主要用于低级调试。

完整性

无问题地解析了 OpenJDK 8 的整个 rt.jar。代码尚未解码。除此之外,所有内容都已解析到合适的数据结构中。

问题

类文件常量池中的字符串目前解析为 Rust 的 String。似乎类文件可能包含代理对的代码点。这些在 UTF-8 编码的字符串中是无效的,而 Rust 使用 UTF-8。因此,每当解码这样的代码点时,它会被替换为 Unicode 替换字符 U+FFFD。这种情况很少发生,但确实会发生。会输出一个带有 info 级别的日志信息。

许可证

Apache 许可证版本 2。请参阅 LICENSE 以获取文本。

依赖项

~165KB