#java #parsing #class #classfile

classfile-parser

A parser for Java Class files written in rust

11 releases

Uses old Rust 2015

0.3.7 Jun 21, 2023
0.3.6 Jun 2, 2023
0.3.5 Jul 12, 2021
0.3.4 Dec 30, 2018
0.2.1 Jun 30, 2017

#493 in Parser implementations

Download history 132/week @ 2023-10-21 78/week @ 2023-10-28 70/week @ 2023-11-04 40/week @ 2023-11-11 38/week @ 2023-11-18 86/week @ 2023-11-25 42/week @ 2023-12-02 38/week @ 2023-12-09 38/week @ 2023-12-16 45/week @ 2023-12-23 26/week @ 2023-12-30 36/week @ 2024-01-06 25/week @ 2024-01-13 30/week @ 2024-01-20 66/week @ 2024-01-27 35/week @ 2024-02-03

162 downloads per month

MIT license

55KB
1.5K SLoC

Java Classfile Parser

LICENSE Rust Crates.io Version

A parser for Java Classfiles, written in Rust using nom.

Installation

Classfile Parser is available from crates.io and can be included in your Cargo enabled project like this:

[dependencies]
classfile-parser = "~0.3"

Usage

extern crate classfile_parser;

use classfile_parser::class_parser;

fn main() {
    let classfile_bytes = include_bytes!("../path/to/JavaClass.class");
    
    match class_parser(classfile_bytes) {
        Ok((_, class_file)) => {
            println!(
                "version {},{} \
                 const_pool({}), \
                 this=const[{}], \
                 super=const[{}], \
                 interfaces({}), \
                 fields({}), \
                 methods({}), \
                 attributes({}), \
                 access({:?})",
                class_file.major_version,
                class_file.minor_version,
                class_file.const_pool_size,
                class_file.this_class,
                class_file.super_class,
                class_file.interfaces_count,
                class_file.fields_count,
                class_file.methods_count,
                class_file.attributes_count,
                class_file.access_flags
            );
        }
        Err(_) => panic!("Failed to parse"),
    };
}

Implementation Status

  • Header
    • Magic const
    • Version info
  • Constant pool
    • Constant pool size
    • Constant types
      • Utf8
      • Integer
      • Float
      • Long
      • Double
      • Class
      • String
      • Fieldref
      • Methodref
      • InterfaceMethodref
      • NameAndType
      • MethodHandle
      • MethodType
      • InvokeDynamic
  • Access flags
  • This class
  • Super class
  • Interfaces
  • Fields
  • Methods
  • Attributes
    • Basic attribute info block parsing
    • Known typed attributes parsing
      • Critical for JVM
        • ConstantValue
        • Code
        • StackMapTable
        • Exceptions
        • BootstrapMethods
      • Critical for Java SE
        • InnerClasses
        • EnclosingMethod
        • Synthetic
        • Signature
        • RuntimeVisibleAnnotations
        • RuntimeInvisibleAnnotations
        • RuntimeVisibleParameterAnnotations
        • RuntimeInvisibleParameterAnnotations
        • RuntimeVisibleTypeAnnotations
        • RuntimeInvisibleTypeAnnotations
        • AnnotationDefault
        • MethodParameters
      • Useful but not critical
        • SourceFile
        • SourceDebugExtension
        • LineNumberTable
        • LocalVariableTable
        • LocalVariableTypeTable
        • Deprecated

Dependencies

~1MB
~18K SLoC