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 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) intbooleanbyte[]Returns the bytecode of the class that was built with this class writer.voidVisits the header of the class.visitField(int access, String name, String desc, String signature, Object value) Visits a field of the class.voidvisitInnerClass(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 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
ClassReaderreceivesMethodVisitorobjects that come from aClassWriter(and not from any otherClassVisitorinstance).
- Parameters:
classReader- theClassReaderused 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:ClassVisitorVisits the header of the class.- Overrides:
visitin 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:ClassVisitorVisits information about an inner class, which is not necessarily a member of the class being visited.- Overrides:
visitInnerClassin classClassVisitor- Parameters:
name- the internal name of an inner classouterName- the internal name of the class to which the inner class belongs;nullfor not member classesinnerName- the (simple) name of the inner class inside its enclosing class;nullfor 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:ClassVisitorVisits a field of the class.- Overrides:
visitFieldin classClassVisitor- Parameters:
access- the field's access flags (seeAccess)name- the field's namedesc- the field's descriptor (seeJavaType)signature- the field's signature;nullwhen the field's type does not use generic typesvalue- the field's initial value;nullwhen the field does not have an initial value; otherwise, must be anInteger, aFloat, aLong, aDoubleor aString(forint,float,longorStringfields 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
nullif 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:ClassVisitorVisits a method of the class. This method must return a newMethodVisitorinstance (ornull) each time it is called, i.e., it should not return a previously returned visitor.- Overrides:
visitMethodin classClassVisitor- Parameters:
access- the method's access flags (seeOpcodes)name- the method's namedesc- the method's descriptor (seeJavaType)signature- the method's signature,nullif 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
nullif 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:
toByteArrayin classClassVisitor
-
addInvokeDynamicReference
@NonNull public DynamicItem addInvokeDynamicReference(@NonNull String name, @NonNull String desc, @NonNull MethodHandle bsm, @NonNull Object... bsmArgs) -
isJava6OrNewer
public boolean isJava6OrNewer()
-