Preview
Second Preview of ClassFile API (JEP 466).
Programs can only use classfile
when preview features are enabled.
Preview features may be removed in a future release,
or upgraded to permanent features of the Java platform.
java.lang.classfile
package contains classes for reading, writing, and
modifying Java class files, as specified in Chapter 4 of the Java
Java Virtual Machine Specification.
java.lang.classfile.ClassModel
; we
convert bytes into a java.lang.classfile.ClassModel
with java.lang.classfile.ClassFile#parse(byte[])
:
ClassModel cm = ClassFile.of().parse(bytes);
There are several additional overloads of parse
that let you specify
various processing options.
A java.
is an immutable description of a class
file. It provides accessor methods to get at class metadata (e.g., java.
, java.
),
as well as subordinate classfile entities (java.
,
java.
). A java.
is inflated lazily; most parts of the classfile are
not parsed until they are actually needed.
We can enumerate the names of the fields and methods in a class by:
ClassModel cm = ClassFile.of().parse(bytes); for (FieldModel fm : cm.fields()) System.out.printf("Field %s%n", fm.fieldName().stringValue()); for (MethodModel mm : cm.methods()) System.out.printf("Method %s%n", mm.methodName().stringValue());
When we enumerate the methods, we get a java.
for each method; like a
ClassModel
, it gives us access to method metadata and
the ability to descend into subordinate entities such as the bytecodes of the
method body. In this way, a ClassModel
is the root of a
tree, with children for fields, methods, and attributes, and MethodModel
in
turn has its own children (attributes, CodeModel
, etc.)
Methods like java.
allows us to traverse the class structure
explicitly, going straight to the parts we are interested in. This is useful
for certain kinds of analysis, but if we wanted to process the whole
classfile, we may want something more organized. A java.
also provides us with a view of the classfile as a
series of class elements, which may include methods, fields, attributes,
and more, and which can be distinguished with pattern matching. We could
rewrite the above example as:
ClassModel cm = ClassFile.of().parse(bytes); for (ClassElement ce : cm) { switch (ce) { case MethodModel mm -> System.out.printf("Method %s%n", mm.methodName().stringValue()); case FieldModel fm -> System.out.printf("Field %s%n", fm.fieldName().stringValue()); default -> { } } }
The models returned as elements from traversing ClassModel
can in
turn be sources of elements. If we wanted to
traverse a classfile and enumerate all the classes for which we access fields
and methods, we can pick out the class elements that describe methods, then
in turn pick out the method elements that describe the code attribute, and
finally pick out the code elements that describe field access and invocation
instructions:
ClassModel cm = ClassFile.of().parse(bytes); Set<ClassDesc> dependencies = new HashSet<>(); for (ClassElement ce : cm) { if (ce instanceof MethodModel mm) { for (MethodElement me : mm) { if (me instanceof CodeModel xm) { for (CodeElement e : xm) { switch (e) { case InvokeInstruction i -> dependencies.add(i.owner().asSymbol()); case FieldInstruction i -> dependencies.add(i.owner().asSymbol()); default -> { } } } } } } }
This same query could alternately be processed as a stream pipeline over class elements:
ClassModel cm = ClassFile.of().parse(bytes); Set<ClassDesc> dependencies = cm.elementStream() .flatMap(ce -> ce instanceof MethodModel mm ? mm.elementStream() : Stream.empty()) .flatMap(me -> me instanceof CodeModel com ? com.elementStream() : Stream.empty()) .<ClassDesc>mapMulti((xe, c) -> { switch (xe) { case InvokeInstruction i -> c.accept(i.owner().asSymbol()); case FieldInstruction i -> c.accept(i.owner().asSymbol()); default -> { } } }) .collect(toSet());
java.lang.classfile.ClassModel#methods()
accessor) or as a linear
sequence of elements. (Elements can in turn also be models; a java.lang.classfile.FieldModel
is also an element of a class.) For each model type
(e.g., java.lang.classfile.MethodModel
), there is a corresponding element
type (java.lang.classfile.MethodElement
). Models and elements are immutable
and are inflated lazily so creating a model does not necessarily require
processing its entire content.
java.lang.classfile.ClassModel
provides a lazily-inflated,
read-only view of the constant pool via java.lang.classfile.ClassModel#constantPool()
.
Descriptions of classfile content is often exposed in the form of various
subtypes of java.lang.classfile.constantpool.PoolEntry
, such as java.lang.classfile.constantpool.ClassEntry
or java.lang.classfile.constantpool.Utf8Entry
.
Constant pool entries are also exposed through models and elements; in the
above traversal example, the java.
element exposed a method for owner
that corresponds to a Constant_Class_info
entry in the constant pool.
Code
attribute. Most attributes are surfaced as elements; for example, java.lang.classfile.attribute.SignatureAttribute
is a java.lang.classfile.ClassElement
, java.lang.classfile.MethodElement
, and java.lang.classfile.FieldElement
since it can appear in all of those places, and is
included when iterating the elements of the corresponding model.
Some attributes are not surfaced as elements; these are attributes that are
tightly coupled to -- and logically part of -- other parts of the class file.
These include the BootstrapMethods
, LineNumberTable
, StackMapTable
, LocalVariableTable
, and LocalVariableTypeTable
attributes. These are processed by the library and
treated as part of the structure they are coupled to (the entries of the
BootstrapMethods
attribute are treated as part of the constant pool;
line numbers and local variable metadata are modeled as elements of java.
.)
The Code
attribute, in addition to being modeled as a java.
, is also a model in its own right (java.
) due to its complex structure.
Each standard attribute has an interface (in java.lang.classfile.attribute
)
which exposes the contents of the attribute and provides factories to
construct the attribute. For example, the Signature
attribute is
defined by the java.
class, and
provides accessors for java.
as well as factories taking java.
or
java.
.
java.lang.classfile.AttributeMapper
. An AttributeMapper
provides the
java.lang.classfile.AttributeMapper#readAttribute(AttributedElement,
ClassReader, int)
method for mapping from the classfile format
to an attribute instance, and the
java.lang.classfile.AttributeMapper#writeAttribute(java.lang.classfile.BufWriter,
java.lang.Object)
method for mapping back to the classfile format. It also
contains metadata including the attribute name, the set of classfile entities
where the attribute is applicable, and whether multiple attributes of the
same kind are allowed on a single entity.
There are built-in attribute mappers (in java.
) for
each of the attribute types defined in section 4.7 of The Java Virtual
Machine Specification, as well as several common nonstandard attributes used by the
JDK such as CharacterRangeTable
.
Unrecognized attributes are delivered as elements of type java.
, which provide access only to the
byte[]
contents of the attribute.
For nonstandard attributes, user-provided attribute mappers can be specified
through the use of the java.
}
classfile option. Implementations of custom attributes should extend java.
.
java.
accepts a list of options. java.
is a base interface
for some statically enumerated options, as well as factories for more complex options,
including:
java.lang.classfile.ClassFile.AttributeMapperOption#of(java.util.function.Function)
-- specify format of custom attributesjava.lang.classfile.ClassFile.AttributesProcessingOption
-- unrecognized or problematic original attributes (default is PASS_ALL_ATTRIBUTES
)java.lang.classfile.ClassFile.ClassHierarchyResolverOption#of(java.lang.classfile.ClassHierarchyResolver)
-- specify a custom class hierarchy resolver used by stack map generationjava.lang.classfile.ClassFile.ConstantPoolSharingOption
}
-- share constant pool when transforming (default is SHARED_POOL
)java.lang.classfile.ClassFile.DeadCodeOption
}
-- patch out unreachable code (default is PATCH_DEAD_CODE
)java.lang.classfile.ClassFile.DeadLabelsOption
}
-- filter unresolved labels (default is FAIL_ON_DEAD_LABELS
)java.lang.classfile.ClassFile.DebugElementsOption
-- processing of debug information, such as local variable metadata (default is PASS_DEBUG
) java.lang.classfile.ClassFile.LineNumbersOption
-- processing of line numbers (default is PASS_LINE_NUMBERS
) java.lang.classfile.ClassFile.ShortJumpsOption
-- automatically rewrite short jumps to long when necessary (default is FIX_SHORT_JUMPS
)java.lang.classfile.ClassFile.StackMapsOption
-- generate stackmaps (default is STACK_MAPS_WHEN_REQUIRED
)Most options allow you to request that certain parts of the classfile be skipped during traversal, such as debug information or unrecognized attributes. Some options allow you to suppress generation of portions of the classfile, such as stack maps. Many of these options are to access performance tradeoffs; processing debug information and line numbers has a cost (both in writing and reading.) If you don't need this information, you can suppress it with options to gain some performance.
java.lang.classfile.ClassBuilder
, methods through
java.lang.classfile.MethodBuilder
, etc.
Rather than creating builders directly, builders are provided as an argument
to a user-provided lambda. To generate the familiar "hello world" program,
we ask for a class builder, and use that class builder to create method
builders for the constructor and main
method, and in turn use the
method builders to create a Code
attribute and use the code builders
to generate the instructions:
byte[] bytes = ClassFile.of().build(CD_Hello, clb -> clb.withFlags(ClassFile.ACC_PUBLIC) .withMethod(ConstantDescs.INIT_NAME, ConstantDescs.MTD_void, ClassFile.ACC_PUBLIC, mb -> mb.withCode( cob -> cob.aload(0) .invokespecial(ConstantDescs.CD_Object, ConstantDescs.INIT_NAME, ConstantDescs.MTD_void) .return_())) .withMethod("main", MTD_void_StringArray, ClassFile.ACC_PUBLIC + ClassFile.ACC_STATIC, mb -> mb.withCode( cob -> cob.getstatic(CD_System, "out", CD_PrintStream) .ldc("Hello World") .invokevirtual(CD_PrintStream, "println", MTD_void_String) .return_())));
The convenience methods ClassBuilder.buildMethodBody
allows us to ask
ClassBuilder
to create code builders to build method bodies directly,
skipping the method builder custom lambda:
byte[] bytes = ClassFile.of().build(CD_Hello, clb -> clb.withFlags(ClassFile.ACC_PUBLIC) .withMethodBody(ConstantDescs.INIT_NAME, ConstantDescs.MTD_void, ClassFile.ACC_PUBLIC, cob -> cob.aload(0) .invokespecial(ConstantDescs.CD_Object, ConstantDescs.INIT_NAME, ConstantDescs.MTD_void) .return_()) .withMethodBody("main", MTD_void_StringArray, ClassFile.ACC_PUBLIC + ClassFile.ACC_STATIC, cob -> cob.getstatic(CD_System, "out", CD_PrintStream) .ldc("Hello World") .invokevirtual(CD_PrintStream, "println", MTD_void_String) .return_()));
Builders often support multiple ways of expressing the same entity at
different levels of abstraction. For example, the invokevirtual
instruction invoking println
could have been generated with CodeBuilder.
, CodeBuilder.
, or CodeBuilder.
.
The convenience method CodeBuilder.invokevirtual
behaves as if it calls
the convenience method CodeBuilder.invokeInstruction
, which in turn behaves
as if it calls method CodeBuilder.with
. This composing of method calls on the
builder enables the composing of transforms (as described later).
Unless otherwise noted, passing a null
argument to a constructor
or method of any Class-File API class or interface will cause a NullPointerException
to be thrown. Additionally,
invoking a method with an array or collection containing a null
element
will cause a NullPointerException
, unless otherwise specified.
java.lang.constant
such as java.lang.constant.ClassDesc
and java.lang.constant.MethodTypeDesc
,
which is less error-prone than using raw strings.
If a constant pool entry has a nominal representation then it provides a
method returning the corresponding nominal descriptor type e.g.
method java.
returns
ClassDesc
.
Where appropriate builders provide two methods for building an element with symbolic information, one accepting nominal descriptors, and the other accepting constant pool entries.
Using nominal descriptors assures the right serial form is applied by the
ClassFile API library based on the actual context. Also these nominal
descriptors are validated during their construction, so it is not possible to
create them with invalid content by mistake. Following example pass class
name to the java.
method for validation
and the library performs automatic conversion to the right internal form of
the class name when serialized in the constant pool as a class entry.
var validClassEntry = constantPoolBuilder.classEntry(ClassDesc.of("mypackage.MyClass"));
On the other hand it is possible to use builders methods and factories accepting constant pool entries directly. Constant pool entries can be constructed also directly from raw values, with no additional conversions or validations. Following example uses intentionally wrong class name form and it is applied without any validation or conversion.
var invalidClassEntry = constantPoolBuilder.classEntry( constantPoolBuilder.utf8Entry("mypackage.MyClass"));
More complex verification of a classfile can be achieved by invocation of
java.
.
XxxBuilder
has a method with(XxxElement)
so that
elements that we wish to pass through unchanged can be handed directly back
to the builder.
If we wanted to strip out methods whose names starts with "debug", we could
get an existing java.
, build a new classfile that
provides a java.
, iterate the elements of the
original java.
, and pass through all of them to
the builder except the methods we want to drop:
ClassModel classModel = ClassFile.of().parse(bytes); byte[] newBytes = ClassFile.of().build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue().startsWith("debug"))) { classBuilder.with(ce); } } });
This hands every class element, except for those corresponding to methods
whose names start with debug
, back to the builder. Transformations
can of course be more complicated, diving into method bodies and instructions
and transforming those as well, but the same structure is repeated at every
level, since every entity has corresponding model, builder, and element
abstractions.
Transformation can be viewed as a "flatMap" operation on the sequence of
elements; for every element, we could pass it through unchanged, drop it, or
replace it with one or more elements. Because transformation is such a
common operation on classfiles, each model type has a corresponding XxxTransform
type (which describes a transform on a sequence of XxxElement
) and each builder type has transformYyy
methods for transforming
its child models. A transform is simply a functional interface that takes a
builder and an element, and an implementation "flatMap"s elements
into the builder. We could express the above as:
ClassTransform ct = (builder, element) -> { if (!(element instanceof MethodModel mm && mm.methodName().stringValue().startsWith("debug"))) builder.with(element); }; var cc = ClassFile.of(); byte[] newBytes = cc.transform(cc.parse(bytes), ct);
ClassTransform.dropping
convenience method allow us to simplify the same
transformation construction and express the above as:
ClassTransform ct = ClassTransform.dropping( element -> element instanceof MethodModel mm && mm.methodName().stringValue().startsWith("debug"));
Foo
to the corresponding method on
Bar
instead. We could express this as a transformation on java.lang.classfile.CodeElement
:
CodeTransform fooToBar = (b, e) -> { if (e instanceof InvokeInstruction i && i.owner().asInternalName().equals("Foo") && i.opcode() == Opcode.INVOKESTATIC) b.invoke(i.opcode(), CD_Bar, i.name().stringValue(), i.typeSymbol(), i.isInterface()); else b.with(e); };
We can then lift this transformation on code elements into a
transformation on method elements. This intercepts method elements that
correspond to a Code
attribute, dives into its code elements, and
applies the code transform to them, and passes other method elements through
unchanged:
MethodTransform mt = MethodTransform.transformingCode(fooToBar);
and further lift the transform on method elements into one on class elements:
ClassTransform ct = ClassTransform.transformingMethods(mt);
or lift the code transform into the class transform directly:
ClassTransform ct = ClassTransform.transformingMethodBodiess(fooToBar);
and then transform the classfile:
var cc = ClassFile.of(); byte[] newBytes = cc.transform(cc.parse(bytes), ct);
This is much more concise (and less error-prone) than the equivalent expressed by traversing the classfile structure directly:
byte[] newBytes = ClassFile.of().build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (ce instanceof MethodModel mm) { classBuilder.withMethod(mm.methodName().stringValue(), mm.methodTypeSymbol(), mm.flags().flagsMask(), methodBuilder -> { for (MethodElement me : mm) { if (me instanceof CodeModel xm) { methodBuilder.withCode(codeBuilder -> { for (CodeElement e : xm) { if (e instanceof InvokeInstruction i && i.owner().asInternalName().equals("Foo") && i.opcode() == Opcode.INVOKESTATIC) codeBuilder.invoke(i.opcode(), CD_Bar, i.name().stringValue(), i.typeSymbol(), i.isInterface()); else codeBuilder.with(e); }}); } else methodBuilder.with(me); } }); } else classBuilder.with(ce); } });
CodeTransform instrumentCalls = (b, e) -> { if (e instanceof InvokeInstruction i) { b.getstatic(CD_System, "out", CD_PrintStream) .ldc(i.name().stringValue()) .invokevirtual(CD_PrintStream, "println", MTD_void_String); } b.with(e); };
Then we can compose fooToBar
and instrumentCalls
with java.
:
var cc = ClassFile.of(); byte[] newBytes = cc.transform(cc.parse(bytes), ClassTransform.transformingMethods( MethodTransform.transformingCode( fooToBar.andThen(instrumentCalls))));
instrumentCalls
will receive all code elements produced by
transform forToBar
, either those code elements from the original classfile
or replacements (replacing static invocations to Foo
with those to Bar
).
java.lang.classfile.ClassFile.ConstantPoolSharingOption
option.
Such suppression may be beneficial when transformation removes many elements,
resulting in many unreferenced constant pool entries.
CodeTransform fooToBar = (b, e) -> { if (ClassFile.latestMajorVersion() > ClassFile.JAVA_22_VERSION) { throw new IllegalArgumentException("Cannot run on JDK > 22"); } switch (e) { case ArrayLoadInstruction i -> doSomething(b, i); case ArrayStoreInstruction i -> doSomething(b, i); default -> b.with(e); } };
ClassTransform fooToBar = (b, e) -> { switch (e) { case ClassFileVersion v when v.majorVersion() > ClassFile.JAVA_22_VERSION -> throw new IllegalArgumentException("Cannot transform class file version " + v.majorVersion()); default -> doSomething(b, e); } };
CodeTransform fooToBar = (b, e) -> { switch (e) { case ArrayLoadInstruction i -> doSomething(b, i); case ArrayStoreInstruction i -> doSomething(b, i); case BranchInstruction i -> doSomething(b, i); case ConstantInstruction i -> doSomething(b, i); case ConvertInstruction i -> doSomething(b, i); case DiscontinuedInstruction i -> doSomething(b, i); case FieldInstruction i -> doSomething(b, i); case InvokeDynamicInstruction i -> doSomething(b, i); case InvokeInstruction i -> doSomething(b, i); case LoadInstruction i -> doSomething(b, i); case StoreInstruction i -> doSomething(b, i); case IncrementInstruction i -> doSomething(b, i); case LookupSwitchInstruction i -> doSomething(b, i); case MonitorInstruction i -> doSomething(b, i); case NewMultiArrayInstruction i -> doSomething(b, i); case NewObjectInstruction i -> doSomething(b, i); case NewPrimitiveArrayInstruction i -> doSomething(b, i); case NewReferenceArrayInstruction i -> doSomething(b, i); case NopInstruction i -> doSomething(b, i); case OperatorInstruction i -> doSomething(b, i); case ReturnInstruction i -> doSomething(b, i); case StackInstruction i -> doSomething(b, i); case TableSwitchInstruction i -> doSomething(b, i); case ThrowInstruction i -> doSomething(b, i); case TypeCheckInstruction i -> doSomething(b, i); case PseudoInstruction i -> doSomething(b, i); default -> throw new IllegalArgumentException("An unknown instruction could not be handled by this transformation"); } };
Conversely, classfile transforms that are only interested in consuming a portion of classfile elements do not need to concern with new and unknown classfile elements and may pass them through. Following example shows such future-proof code transformation:
CodeTransform fooToBar = (b, e) -> { switch (e) { case ArrayLoadInstruction i -> doSomething(b, i); case ArrayStoreInstruction i -> doSomething(b, i); default -> b.with(e); } };
The API is largely derived from a data model
for the classfile format, which defines each element kind (which includes models and
attributes) and its properties. For each element kind, there is a
corresponding interface to describe that element, and factory methods to
create that element. Some element kinds also have convenience methods on the
corresponding builder (e.g., java.
).
Most symbolic information in elements is represented by constant pool entries
(for example, the owner of a field is represented by a java.
.) Factories and builders also
accept nominal descriptors from java.lang.constant
(e.g., java.
.)
ClassElement =
FieldModel*(UtfEntry name, Utf8Entry descriptor)
| MethodModel*(UtfEntry name, Utf8Entry descriptor)
| ModuleAttribute?(int flags, ModuleEntry moduleName, UtfEntry moduleVersion,
List<ModuleRequireInfo> requires, List<ModuleOpenInfo> opens,
List<ModuleExportInfo> exports, List<ModuleProvidesInfo> provides,
List<ClassEntry> uses)
| ModulePackagesAttribute?(List<PackageEntry> packages)
| ModuleTargetAttribute?(Utf8Entry targetPlatform)
| ModuleHashesAttribute?(Utf8Entry algorithm, List<HashInfo> hashes)
| ModuleResolutionAttribute?(int resolutionFlags)
| SourceFileAttribute?(Utf8Entry sourceFile)
| SourceDebugExtensionsAttribute?(byte[] contents)
| CompilationIDAttribute?(Utf8Entry compilationId)
| SourceIDAttribute?(Utf8Entry sourceId)
| NestHostAttribute?(ClassEntry nestHost)
| NestMembersAttribute?(List<ClassEntry> nestMembers)
| RecordAttribute?(List<RecordComponent> components)
| EnclosingMethodAttribute?(ClassEntry className, NameAndTypeEntry method)
| InnerClassesAttribute?(List<InnerClassInfo> classes)
| PermittedSubclassesAttribute?(List<ClassEntry> permittedSubclasses)
| DeclarationElement*
where DeclarationElement
are the elements that are common to all declarations
(classes, methods, fields) and so are factored out:
DeclarationElement =
SignatureAttribute?(Utf8Entry signature)
| SyntheticAttribute?()
| DeprecatedAttribute?()
| RuntimeInvisibleAnnotationsAttribute?(List<Annotation> annotations)
| RuntimeVisibleAnnotationsAttribute?(List<Annotation> annotations)
| CustomAttribute*
| UnknownAttribute*
java.lang.classfile.CodeModel
(which models the Code
attribute
along with the code-related attributes: stack map table, local variable table,
line number table, etc.)
FieldElement =
DeclarationElement
| ConstantValueAttribute?(ConstantValueEntry constant)
MethodElement =
DeclarationElement
| CodeModel?()
| AnnotationDefaultAttribute?(ElementValue defaultValue)
| MethodParametersAttribute?(List<MethodParameterInfo> parameters)
| ExceptionsAttribute?(List<ClassEntry> exceptions)
java.lang.classfile.CodeModel
is unique in that its elements are ordered.
Elements of Code
include ordinary bytecodes, as well as a number of pseudo-instructions
representing branch targets, line number metadata, local variable metadata, and
catch blocks.
CodeElement = Instruction | PseudoInstruction
Instruction =
LoadInstruction(TypeKind type, int slot)
| StoreInstruction(TypeKind type, int slot)
| IncrementInstruction(int slot, int constant)
| BranchInstruction(Opcode opcode, Label target)
| LookupSwitchInstruction(Label defaultTarget, List<SwitchCase> cases)
| TableSwitchInstruction(Label defaultTarget, int low, int high,
List<SwitchCase> cases)
| ReturnInstruction(TypeKind kind)
| ThrowInstruction()
| FieldInstruction(Opcode opcode, FieldRefEntry field)
| InvokeInstruction(Opcode opcode, MemberRefEntry method, boolean isInterface)
| InvokeDynamicInstruction(InvokeDynamicEntry invokedynamic)
| NewObjectInstruction(ClassEntry className)
| NewReferenceArrayInstruction(ClassEntry componentType)
| NewPrimitiveArrayInstruction(TypeKind typeKind)
| NewMultiArrayInstruction(ClassEntry componentType, int dims)
| ArrayLoadInstruction(Opcode opcode)
| ArrayStoreInstruction(Opcode opcode)
| TypeCheckInstruction(Opcode opcode, ClassEntry className)
| ConvertInstruction(TypeKind from, TypeKind to)
| OperatorInstruction(Opcode opcode)
| ConstantInstruction(ConstantDesc constant)
| StackInstruction(Opcode opcode)
| MonitorInstruction(Opcode opcode)
| NopInstruction()
PseudoInstruction =
| LabelTarget(Label label)
| LineNumber(int line)
| ExceptionCatch(Label tryStart, Label tryEnd, Label handler, ClassEntry exception)
| LocalVariable(int slot, UtfEntry name, Utf8Entry type, Label startScope, Label endScope)
| LocalVariableType(int slot, Utf8Entry name, Utf8Entry type, Label startScope, Label endScope)
| CharacterRange(int rangeStart, int rangeEnd, int flags, Label startScope, Label endScope)
Modifier and Type | Interface and Description |
---|---|
public interface | AccessFlags
Preview
Second Preview of ClassFile API (JEP 466).
Models the access flags for a class, method, or field.
|
public interface | Annotation
Preview
Second Preview of ClassFile API (JEP 466).
Models an annotation on a declaration.
|
public interface | AnnotationElement
Preview
Second Preview of ClassFile API (JEP 466).
Models a key-value pair of an annotation.
|
public interface | AnnotationValue
Preview
Second Preview of ClassFile API (JEP 466).
Models the value of a key-value pair of an annotation.
|
public interface | Attribute<
the attribute type A extends Attribute
Preview
Second Preview of ClassFile API (JEP 466).
Models a classfile attribute 4.7.
|
public interface | AttributedElement
Preview
Second Preview of ClassFile API (JEP 466).
A ClassFileElement describing an entity that has attributes, such
as a class, field, method, code attribute, or record component.
|
public interface | AttributeMapper<
the attribute type A>
Preview
Second Preview of ClassFile API (JEP 466).
Bidirectional mapper between the classfile representation of an attribute and
how that attribute is modeled in the API.
|
public interface | BootstrapMethodEntry
Preview
Second Preview of ClassFile API (JEP 466).
Models an entry in the bootstrap method table.
|
public interface | BufWriter
Preview
Second Preview of ClassFile API (JEP 466).
Supports writing portions of a classfile to a growable buffer.
|
public interface | ClassBuilder
Preview
Second Preview of ClassFile API (JEP 466).
A builder for classfiles.
|
public interface | ClassElement
Preview
Second Preview of ClassFile API (JEP 466).
A marker interface for elements that can appear when traversing
a ClassModel or be presented to a ClassBuilder .
|
public interface | ClassFile
Preview
Second Preview of ClassFile API (JEP 466).
Represents a context for parsing, transforming, and generating classfiles.
|
public interface | ClassFileBuilder<
the element type E extends ClassFileElement, the builder type B extends ClassFileBuilder
Preview
Second Preview of ClassFile API (JEP 466).
A builder for a classfile or portion of a classfile.
|
public interface | ClassFileElement
Preview
Second Preview of ClassFile API (JEP 466).
Immutable model for a portion of (or the entirety of) a classfile.
|
public interface | ClassFileTransform<
the transform type C extends ClassFileTransformthe element type E extends ClassFileElement, the builder type B extends ClassFileBuilder
Preview
Second Preview of ClassFile API (JEP 466).
A transformation on streams of elements.
|
public interface | ClassFileVersion
Preview
Second Preview of ClassFile API (JEP 466).
Models the classfile version information for a class.
|
public interface | ClassHierarchyResolver
Preview
Second Preview of ClassFile API (JEP 466).
Provides class hierarchy information for generating correct stack maps
during code building.
|
public interface | ClassModel
Preview
Second Preview of ClassFile API (JEP 466).
Models a classfile.
|
public interface | ClassReader
Preview
Second Preview of ClassFile API (JEP 466).
Supports reading from a classfile.
|
public interface | ClassSignature
Preview
Second Preview of ClassFile API (JEP 466).
Models the generic signature of a class file, as defined by 4.7.9.
|
public interface | ClassTransform
Preview
Second Preview of ClassFile API (JEP 466).
A transformation on streams of ClassElement .
|
public interface | CodeBuilder
Preview
Second Preview of ClassFile API (JEP 466).
A builder for code attributes (method bodies).
|
public interface | CodeElement
Preview
Second Preview of ClassFile API (JEP 466).
A marker interface for elements that can appear when traversing
a CodeModel or be presented to a CodeBuilder .
|
public interface | CodeModel
Preview
Second Preview of ClassFile API (JEP 466).
Models the body of a method (the Code attribute).
|
public interface | CodeTransform
Preview
Second Preview of ClassFile API (JEP 466).
A transformation on streams of CodeElement .
|
public interface | CompoundElement<
the element type E extends ClassFileElement>
Preview
Second Preview of ClassFile API (JEP 466).
A ClassFileElement that has complex structure defined in terms of
other classfile elements, such as a method, field, method body, or entire
class.
|
public interface | FieldBuilder
Preview
Second Preview of ClassFile API (JEP 466).
A builder for fields.
|
public interface | FieldElement
Preview
Second Preview of ClassFile API (JEP 466).
A marker interface for elements that can appear when traversing
a FieldModel or be presented to a FieldBuilder .
|
public interface | FieldModel
Preview
Second Preview of ClassFile API (JEP 466).
Models a field.
|
public interface | FieldTransform
Preview
Second Preview of ClassFile API (JEP 466).
A transformation on streams of FieldElement .
|
public interface | Instruction
Preview
Second Preview of ClassFile API (JEP 466).
Models an executable instruction in a method body.
|
public interface | Interfaces
Preview
Second Preview of ClassFile API (JEP 466).
Models the interfaces of a class.
|
public interface | Label
Preview
Second Preview of ClassFile API (JEP 466).
A marker for a position within the instructions of a method body.
|
public interface | MethodBuilder
Preview
Second Preview of ClassFile API (JEP 466).
A builder for methods.
|
public interface | MethodElement
Preview
Second Preview of ClassFile API (JEP 466).
A marker interface for elements that can appear when traversing
a MethodModel or be presented to a MethodBuilder .
|
public interface | MethodModel
Preview
Second Preview of ClassFile API (JEP 466).
Models a method.
|
public interface | MethodSignature
Preview
Second Preview of ClassFile API (JEP 466).
Models the generic signature of a method, as defined by 4.7.9.
|
public interface | MethodTransform
Preview
Second Preview of ClassFile API (JEP 466).
A transformation on streams of MethodElement .
|
public interface | PseudoInstruction
Preview
Second Preview of ClassFile API (JEP 466).
Models metadata about a CodeAttribute , such as entries in the
exception table, line number table, local variable table, or the mapping
between instructions and labels.
|
public interface | Signature
Preview
Second Preview of ClassFile API (JEP 466).
Models generic Java type signatures, as defined in 4.7.9.1.
|
public interface | Superclass
Preview
Second Preview of ClassFile API (JEP 466).
Models the superclass of a class.
|
public interface | TypeAnnotation
Preview
Second Preview of ClassFile API (JEP 466).
Models an annotation on a type use, as defined in 4.7.19 and 4.7.20.
|
public interface | WritableElement<
the type of the entity T>
Preview
Second Preview of ClassFile API (JEP 466).
A classfile element that can encode itself as a stream of bytes in the
encoding expected by the classfile format.
|
Modifier and Type | Class and Description |
---|---|
public class | Attributes
Preview
Second Preview of ClassFile API (JEP 466).
Attribute mappers for standard classfile attributes.
|
public abstract class | CustomAttribute<
the custom attribute type T extends CustomAttribute
Preview
Second Preview of ClassFile API (JEP 466).
Models a non-standard attribute of a classfile.
|
Modifier and Type | Enum and Description |
---|---|
public enum | Opcode
Preview
Second Preview of ClassFile API (JEP 466).
Describes the opcodes of the JVM instruction set, as described in 6.5.
|
public enum | TypeKind
Preview
Second Preview of ClassFile API (JEP 466).
Describes the types that can be part of a field or method descriptor.
|