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