1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//! # Ristretto `ClassFile`
//!
//! [](https://codecov.io/gh/theseus-rs/ristretto)
//! [](https://bencher.dev/perf/theseus-rs-ristretto)
//! [](https://github.com/theseus-rs/ristretto#license)
//! [](https://semver.org/spec/v2.0.0.html)
//!
//! Implementation of the [JVM Class File Format](https://docs.oracle.com/javase/specs/jvms/se25/html/jvms-4.html)
//! that is used to read, write and verify Java classes.
//!
//! Supports reading, writing, and verifying class files for any version of Java version up to 25.
//!
//! ## Examples
//!
//! ### Creating a Simple Class File
//!
//! ```rust
//! use ristretto_classfile::{ClassFile, ConstantPool, Version, JAVA_21};
//!
//! let mut constant_pool = ConstantPool::default();
//! let this_class = constant_pool.add_class("Foo")?;
//! let class_file = ClassFile {
//! version: JAVA_21,
//! constant_pool,
//! this_class,
//! ..Default::default()
//! };
//! class_file.verify()?;
//! # Ok::<(), ristretto_classfile::Error>(())
//! ```
//!
//! ### Reading a Class File from Bytes
//!
//! ```rust,no_run
//! use ristretto_classfile::ClassFile;
//! use std::fs;
//!
//! // Read the bytes of a class file
//! let bytes = fs::read("path/to/Example.class")?;
//!
//! // Parse the bytes into a ClassFile
//! let class_file = ClassFile::from_bytes(&bytes)?;
//!
//! // Now you can inspect the class
//! println!("Class name: {}", class_file.class_name()?);
//! println!("Class version: {}", class_file.version);
//! # Ok::<(), ristretto_classfile::Error>(())
//! ```
//!
//! ### Writing a Class File to Bytes
//!
//! ```rust,no_run
//! use ristretto_classfile::{ClassFile, ConstantPool, Version, ClassAccessFlags, JAVA_21};
//! use std::fs;
//! use std::io::Write;
//!
//! // Create a new class file
//! let mut constant_pool = ConstantPool::default();
//! let this_class = constant_pool.add_class("HelloWorld")?;
//! let super_class = constant_pool.add_class("java/lang/Object")?;
//!
//! let class_file = ClassFile {
//! version: JAVA_21,
//! access_flags: ClassAccessFlags::PUBLIC,
//! constant_pool,
//! this_class,
//! super_class,
//! ..Default::default()
//! };
//!
//! // Verify the class file is valid
//! class_file.verify()?;
//!
//! // Write the class file to a vector of bytes
//! let mut buffer = Vec::new();
//! class_file.to_bytes(&mut buffer)?;
//!
//! // Now you can save these bytes to a file
//! fs::write("HelloWorld.class", buffer)?;
//! # Ok::<(), Box<dyn std::error::Error>>(())
//! ```
pub use BaseType;
pub use ClassAccessFlags;
pub use ClassFile;
pub use Constant;
pub use ConstantPool;
pub use ;
pub use Field;
pub use FieldAccessFlags;
pub use FieldType;
pub use ;
pub use Method;
pub use MethodAccessFlags;
pub use ReferenceKind;
pub use VerifyMode;
pub use ;