Package mockit.asm.classes
Class ClassWriter
java.lang.Object
mockit.asm.BaseWriter
mockit.asm.classes.ClassVisitor
mockit.asm.classes.ClassWriter
A
ClassVisitor
that generates classes in bytecode form, that is, a byte array conforming to the
Java class file format.
It can be used alone, to generate a Java class "from scratch", or with one or more ClassReader
and adapter
class visitor to generate a modified class from one or more existing Java classes.
-
Field Summary
FieldsModifier and TypeFieldDescriptionfinal byte[]
The class bytecode from which this class writer will generate a new/modified class.Fields inherited from class mockit.asm.BaseWriter
annotations, classOrMemberAccess, cp
-
Constructor Summary
ConstructorsConstructorDescriptionClassWriter
(ClassReader classReader) Initializes a new class writer, applying the following two optimizations that are useful for "mostly add" bytecode transformations: The constant pool from the original class is copied as is in the new class, which saves time. -
Method Summary
Modifier and TypeMethodDescriptionaddInvokeDynamicReference
(String name, String desc, MethodHandle bsm, Object... bsmArgs) int
boolean
byte[]
Returns the bytecode of the class that was built with this class writer.void
Visits the header of the class.visitField
(int access, String name, String desc, String signature, Object value) Visits a field of the class.void
visitInnerClass
(String name, String outerName, String innerName, int access) Visits information about an inner class, which is not necessarily a member of the class being visited.visitMethod
(int access, String name, String desc, String signature, String[] exceptions) Visits a method of the class.Methods inherited from class mockit.asm.BaseWriter
createMarkerAttributes, getAnnotationsSize, getConstantPoolGeneration, getMarkerAttributeCount, getMarkerAttributesSize, put, put, putAccess, putAnnotations, putMarkerAttributes, visitAnnotation, visitEnd
-
Field Details
-
code
@NonNull public final byte[] codeThe class bytecode from which this class writer will generate a new/modified class.
-
-
Constructor Details
-
ClassWriter
Initializes a new class writer, applying the following two optimizations that are useful for "mostly add" bytecode transformations:- The constant pool from the original class is copied as is in the new class, which saves time. New constant pool entries will be added at the end if necessary, but unused constant pool entries won't be removed.
- Methods that are not transformed are copied as is in the new class, directly from the original class bytecode
(i.e. without emitting visit events for all the method instructions), which saves a lot of time.
Untransformed methods are detected by the fact that the
ClassReader
receivesMethodVisitor
objects that come from aClassWriter
(and not from any otherClassVisitor
instance).
- Parameters:
classReader
- theClassReader
used to read the original class; it will be used to copy the entire constant pool from the original class and also to copy other fragments of original bytecode where applicable
-
-
Method Details
-
getClassVersion
public int getClassVersion() -
getInternalClassName
-
visit
Description copied from class:ClassVisitor
Visits the header of the class.- Overrides:
visit
in classClassVisitor
- Parameters:
version
- the class versionaccess
- the class's access flags (seeAccess
)name
- the internal name of the classadditionalInfo
- additional class information
-
visitInnerClass
public void visitInnerClass(@NonNull String name, @Nullable String outerName, @Nullable String innerName, int access) Description copied from class:ClassVisitor
Visits information about an inner class, which is not necessarily a member of the class being visited.- Overrides:
visitInnerClass
in classClassVisitor
- Parameters:
name
- the internal name of an inner classouterName
- the internal name of the class to which the inner class belongs;null
for not member classesinnerName
- the (simple) name of the inner class inside its enclosing class;null
for anonymous inner classesaccess
- the access flags of the inner class as originally declared in the enclosing class
-
visitField
@NonNull public FieldVisitor visitField(int access, @NonNull String name, @NonNull String desc, @Nullable String signature, @Nullable Object value) Description copied from class:ClassVisitor
Visits a field of the class.- Overrides:
visitField
in classClassVisitor
- Parameters:
access
- the field's access flags (seeAccess
)name
- the field's namedesc
- the field's descriptor (seeJavaType
)signature
- the field's signature;null
when the field's type does not use generic typesvalue
- the field's initial value;null
when the field does not have an initial value; otherwise, must be anInteger
, aFloat
, aLong
, aDouble
or aString
(forint
,float
,long
orString
fields respectively); this parameter is only used for static fields; its value is ignored for non static fields, which must be initialized through bytecode instructions in constructors or methods- Returns:
- a visitor to visit field annotations and attributes, or
null
if this class visitor is not interested in visiting these annotations and attributes
-
visitMethod
@NonNull public MethodWriter visitMethod(int access, @NonNull String name, @NonNull String desc, @Nullable String signature, @Nullable String[] exceptions) Description copied from class:ClassVisitor
Visits a method of the class. This method must return a newMethodVisitor
instance (ornull
) each time it is called, i.e., it should not return a previously returned visitor.- Overrides:
visitMethod
in classClassVisitor
- Parameters:
access
- the method's access flags (seeOpcodes
)name
- the method's namedesc
- the method's descriptor (seeJavaType
)signature
- the method's signature,null
if the method parameters, return type and exceptions do not use generic typesexceptions
- the internal names of the method's exception classes- Returns:
- an object to visit the byte code of the method, or
null
if this class visitor is not interested in visiting the code of this method
-
toByteArray
@NonNull public byte[] toByteArray()Returns the bytecode of the class that was built with this class writer.- Overrides:
toByteArray
in classClassVisitor
-
addInvokeDynamicReference
@NonNull public DynamicItem addInvokeDynamicReference(@NonNull String name, @NonNull String desc, @NonNull MethodHandle bsm, @NonNull Object... bsmArgs) -
isJava6OrNewer
public boolean isJava6OrNewer()
-