or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

builder.mdclassfile.mdcollections.mdfunctional.mdindex.mdsignatures.mdstream.md
tile.json

classfile.mddocs/

Class File Processing

Complete Java class file parsing, manipulation, and generation capabilities with full support for all JVM bytecode features including modules, records, sealed classes, and type annotations. This module provides comprehensive access to Java bytecode structure while maintaining type safety and performance.

Capabilities

ClassFile Operations

Core class file parsing and writing functionality.

/**
 * Represents a complete Java class file with all its components
 */
public class ClassFile extends ElementInfo {
    public final int minor_version;
    public final int major_version;
    public final ConstantPool constant_pool;
    public final String this_class;
    public final String super_class;
    public final String[] interfaces;
    public final FieldInfo[] fields;
    public final MethodInfo[] methods;
    
    /**
     * Parse a class file from input stream
     * @param in DataInput to read from
     * @return Parsed ClassFile instance
     * @throws IOException if parsing fails
     */
    public static ClassFile parseClassFile(DataInput in) throws IOException;
    
    /**
     * Write class file to output stream
     * @param out DataOutput to write to
     * @throws IOException if writing fails
     */
    public void write(DataOutput out) throws IOException;
    
    /**
     * Write class file to output stream
     * @param out OutputStream to write to
     * @throws IOException if writing fails
     */
    public void write(OutputStream out) throws IOException;
    
    /**
     * Write class file to byte array
     * @return Byte array containing class file data
     * @throws IOException if writing fails
     */
    public byte[] write() throws IOException;
}

Usage Examples:

import aQute.bnd.classfile.ClassFile;
import java.io.*;

// Parse class file from file
try (FileInputStream fis = new FileInputStream("Example.class");
     DataInputStream dis = new DataInputStream(fis)) {
    ClassFile classFile = ClassFile.parseClassFile(dis);
    System.out.println("Class name: " + classFile.this_class);
    System.out.println("Super class: " + classFile.super_class);
    System.out.println("Methods: " + classFile.methods.length);
}

// Write modified class file
byte[] bytecode = classFile.write();
Files.write(Paths.get("Modified.class"), bytecode);

Constant Pool Operations

Access and manipulation of Java class file constant pools.

/**
 * Represents and manipulates Java class file constant pools
 */
public class ConstantPool {
    // Constant pool entry type constants
    public static final int CONSTANT_Utf8 = 1;
    public static final int CONSTANT_Integer = 3;
    public static final int CONSTANT_Float = 4;
    public static final int CONSTANT_Long = 5;
    public static final int CONSTANT_Double = 6;
    public static final int CONSTANT_Class = 7;
    public static final int CONSTANT_String = 8;
    public static final int CONSTANT_Fieldref = 9;
    public static final int CONSTANT_Methodref = 10;
    public static final int CONSTANT_InterfaceMethodref = 11;
    public static final int CONSTANT_NameAndType = 12;
    public static final int CONSTANT_MethodHandle = 15;
    public static final int CONSTANT_MethodType = 16;
    public static final int CONSTANT_Dynamic = 17;
    public static final int CONSTANT_InvokeDynamic = 18;
    public static final int CONSTANT_Module = 19;
    public static final int CONSTANT_Package = 20;
    
    /**
     * Get the size of the constant pool
     * @return Number of entries in constant pool
     */
    public int size();
    
    /**
     * Get constant pool entry at specified index
     * @param index Index of entry to retrieve
     * @return Constant pool entry
     */
    public <T> T entry(int index);
    
    /**
     * Get entry type tag at specified index
     * @param index Index of entry
     * @return Type tag constant
     */
    public int tag(int index);
    
    /**
     * Get UTF-8 string from constant pool
     * @param utf8_index Index of UTF-8 entry
     * @return String value
     */
    public String utf8(int utf8_index);
    
    /**
     * Get class name from constant pool
     * @param class_info_index Index of class info entry
     * @return Class name string
     */
    public String className(int class_info_index);
    
    /**
     * Get module name from constant pool
     * @param module_info_index Index of module info entry
     * @return Module name string
     */
    public String moduleName(int module_info_index);
    
    /**
     * Get package name from constant pool
     * @param package_info_index Index of package info entry
     * @return Package name string
     */
    public String packageName(int package_info_index);
    
    /**
     * Read constant pool from input stream
     * @param in DataInput to read from
     * @return Constant pool instance
     * @throws IOException if reading fails
     */
    public static ConstantPool read(DataInput in) throws IOException;
    
    /**
     * Write constant pool to output stream
     * @param out DataOutput to write to
     * @throws IOException if writing fails
     */
    public void write(DataOutput out) throws IOException;
}

Class File Building

Programmatic construction of class files using builder pattern.

/**
 * Builder for constructing ClassFile objects programmatically
 */
public class ClassFileBuilder {
    /**
     * Set minor version number
     * @param minor_version Minor version
     * @return This builder instance
     */
    public ClassFileBuilder minor_version(int minor_version);
    
    /**
     * Set major version number
     * @param major_version Major version
     * @return This builder instance
     */
    public ClassFileBuilder major_version(int major_version);
    
    /**
     * Set access flags
     * @param access Access flags
     * @return This builder instance
     */
    public ClassFileBuilder access(int access);
    
    /**
     * Set this class name
     * @param this_class Class name
     * @return This builder instance
     */
    public ClassFileBuilder this_class(String this_class);
    
    /**
     * Set super class name
     * @param super_class Super class name
     * @return This builder instance
     */
    public ClassFileBuilder super_class(String super_class);
    
    /**
     * Set interface names
     * @param interfaces Array of interface names
     * @return This builder instance
     */
    public ClassFileBuilder interfaces(String... interfaces);
    
    /**
     * Set field information
     * @param fields Array of field info
     * @return This builder instance
     */
    public ClassFileBuilder fields(FieldInfo... fields);
    
    /**
     * Set method information
     * @param methods Array of method info
     * @return This builder instance
     */
    public ClassFileBuilder methods(MethodInfo... methods);
    
    /**
     * Set attributes
     * @param attributes Array of attributes
     * @return This builder instance
     */
    public ClassFileBuilder attributes(Attribute... attributes);
    
    /**
     * Build the final ClassFile object
     * @return Constructed ClassFile instance
     */
    public ClassFile build();
}

/**
 * Mutable constant pool for building class files
 */
public class MutableConstantPool extends ConstantPool {
    /**
     * Add UTF-8 string to constant pool
     * @param string String to add
     * @return Index of added entry
     */
    public int utf8Info(String string);
    
    /**
     * Add class info to constant pool
     * @param class_name Class name to add
     * @return Index of added entry
     */
    public int classInfo(String class_name);
    
    /**
     * Add string info to constant pool
     * @param string String value to add
     * @return Index of added entry
     */
    public int stringInfo(String string);
}

Usage Examples:

import aQute.bnd.classfile.builder.ClassFileBuilder;
import aQute.bnd.classfile.builder.MutableConstantPool;

// Build a simple class file
MutableConstantPool cp = new MutableConstantPool();
ClassFile newClass = new ClassFileBuilder(cp)
    .major_version(61) // Java 17
    .access(ClassFile.ACC_PUBLIC)
    .this_class("com/example/GeneratedClass")
    .super_class("java/lang/Object")
    .build();

byte[] bytecode = newClass.write();

Field and Method Information

Access to field and method metadata within class files.

/**
 * Base class for field and method information
 */
public abstract class MemberInfo extends ElementInfo {
    public final String name;
    public final String descriptor;
    
    protected MemberInfo(int access, String name, String descriptor, Attribute[] attributes);
}

/**
 * Represents field information in a class file
 */
public class FieldInfo extends MemberInfo {
    public FieldInfo(int access, String name, String descriptor, Attribute[] attributes);
}

/**
 * Represents method information in a class file
 */
public class MethodInfo extends MemberInfo {
    public MethodInfo(int access, String name, String descriptor, Attribute[] attributes);
}

/**
 * Base class for class file elements with access flags and attributes
 */
public abstract class ElementInfo {
    public final int access;
    public final Attribute[] attributes;
    
    protected ElementInfo(int access, Attribute[] attributes);
    
    /**
     * Get attribute of specified type
     * @param type Attribute class type
     * @return Optional containing attribute if found
     */
    public <T> Optional<T> getAttribute(Class<T> type);
}

Attributes

Comprehensive support for all Java class file attributes.

/**
 * Interface for class file attributes
 */
public interface Attribute {
    /**
     * Get attribute name
     * @return Attribute name string
     */
    String name();
    
    /**
     * Write attribute to output stream
     * @param out DataOutput to write to
     * @param constant_pool Constant pool for resolving references
     * @throws IOException if writing fails
     */
    void write(DataOutput out, ConstantPool constant_pool) throws IOException;
    
    /**
     * Get attribute length in bytes
     * @return Attribute length
     */
    int attribute_length();
    
    /**
     * Read attributes from input stream
     * @param in DataInput to read from
     * @param constant_pool Constant pool for resolving references
     * @return Array of attributes
     * @throws IOException if reading fails
     */
    static Attribute[] readAttributes(DataInput in, ConstantPool constant_pool) throws IOException;
}

// Common attribute implementations
public class CodeAttribute implements Attribute { /* Method bytecode */ }
public class ConstantValueAttribute implements Attribute { /* Constant field values */ }
public class SignatureAttribute implements Attribute { /* Generic type signatures */ }
public class SourceFileAttribute implements Attribute { /* Source file name */ }
public class ModuleAttribute implements Attribute { /* Module information */ }
public class RecordAttribute implements Attribute { /* Record component information */ }
public class PermittedSubclassesAttribute implements Attribute { /* Sealed class subclasses */ }

Constants

public class ClassFile {
    // Class file version constants
    public static final int MAJOR_VERSION = 61; // Current major version
    
    // Access flag constants
    public static final int ACC_PUBLIC = 0x0001;
    public static final int ACC_PRIVATE = 0x0002;
    public static final int ACC_PROTECTED = 0x0004;
    public static final int ACC_STATIC = 0x0008;
    public static final int ACC_FINAL = 0x0010;
    public static final int ACC_SUPER = 0x0020;
    public static final int ACC_VOLATILE = 0x0040;
    public static final int ACC_TRANSIENT = 0x0080;
    public static final int ACC_NATIVE = 0x0100;
    public static final int ACC_INTERFACE = 0x0200;
    public static final int ACC_ABSTRACT = 0x0400;
    public static final int ACC_STRICT = 0x0800;
    public static final int ACC_SYNTHETIC = 0x1000;
    public static final int ACC_ANNOTATION = 0x2000;
    public static final int ACC_ENUM = 0x4000;
    public static final int ACC_MODULE = 0x8000;
}