| Crates.io | cafebabe |
| lib.rs | cafebabe |
| version | 0.9.0 |
| created_at | 2021-04-03 18:10:59.057624+00 |
| updated_at | 2025-06-03 15:12:43.02834+00 |
| description | A simple parser for Java class files |
| homepage | https://github.com/staktrace/cafebabe/blob/main/README.md |
| repository | https://github.com/staktrace/cafebabe |
| max_upload_size | |
| id | 378408 |
| size | 176,432 |
cafebabe is a parser for .class files, which are generated by the javac compiler and other compilers targeting the JVM.
It supports the class file format from Java 21 (September 2023).
There are a bunch of different class file parsers available on crates.io. Main differentiators for cafebabe are:
cafebabe does all this internally and returns the "primitive" type you get after doing the constant pool lookups.
Consider the example of reading a classinfo member.
With most other parsers, you get a u16 from the parser, with which you have to:
(a) do a constant pool lookup,
(b) verify it's a classinfo type,
(c) extract the u16 from the classinfo,
(d) do another constant pool lookup,
(e) verify it's a utf8 type,
(f) read the string.
With cafebabe you just get the string right off the bat, since all the type checking and lookups were done during the parsing phase.Cow<'a, str> which are tied to the lifetime of your input class bytes.
This means there's zero copying for strings anywhere in cafebabe itself, except in the rare case where a string is in the subset of modified "java utf-8" that isn't regular utf-8.The main parsing code is fully implemented. All structures (including attributes) described in Chapter 4 of the JVM spec are supported.
The entire modules file of the OpenJDK 16/17/21 distributions can be parsed without errors.
cafebabe will do some kinds of validation/checking at parse time, but not everything described in Chapter 4 of the JVM spec.
It does all of section 4.8 validation ("Format checking") except possibly some of the attribute validations (the Signature attribute, for instance).
A reasonable goal for this project is to fully implement section 4.8, so patches would be accepted for additional format checking.
Why is the project called cafebabe?
Because the first 4 bytes in any valid class file are a magic identifier with the value 0xCAFEBABE. ☕