Package org.eclipse.sisu.space.asm
Class ClassWriter
java.lang.Object
org.eclipse.sisu.space.asm.ClassVisitor
org.eclipse.sisu.space.asm.ClassWriter
A
ClassVisitor
that generates classes in bytecode form. More
precisely this visitor generates 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 TypeFieldDescription(package private) static final int
Pseudo access flag to distinguish between the synthetic attribute and the synthetic access flag.private int
The access flags of this class.private AnnotationWriter
The runtime visible annotations of this class.private Attribute
The non standard attributes of this class.(package private) ByteVector
The BootstrapMethods attribute.(package private) int
The number of entries in the BootstrapMethods attribute.(package private) static final int
The type of BootstrapMethods items.(package private) static final int
The type of CONSTANT_Class constant pool items.static final int
Flag to automatically compute the stack map frames of methods from scratch.static final int
Flag to automatically compute the maximum stack size and the maximum number of local variables of methods.private boolean
true if the stack map frames must be recomputed from scratch.private boolean
true if the maximum stack size and number of local variables must be automatically computed.(package private) ClassReader
The class reader from which this class writer was constructed, if any.(package private) static final int
The type of CONSTANT_Double constant pool items.private int
The constant pool item that contains the name and descriptor of the enclosing method of this class.private int
The constant pool item that contains the name of the enclosing class of this class.(package private) static final int
The type of CONSTANT_Fieldref constant pool items.(package private) static final int
The type of field and method invocations instructions.(package private) FieldWriter
The fields of this class.(package private) MethodWriter
The methods of this class.(package private) static final int
The type of CONSTANT_Float constant pool items.(package private) static final int
The type of CONSTANT_MethodHandle constant pool items.(package private) static final int
The base value for all CONSTANT_MethodHandle constant pool items.private AnnotationWriter
The runtime invisible annotations of this class.(package private) static final int
The type of the IINC instruction.(package private) static final int
The type of CONSTANT_InterfaceMethodref constant pool items.(package private) static final int
The type of instructions with an implicit local variable index argument.(package private) int
Index of the next item to be added in the constant pool.(package private) static final int
The type of CONSTANT_InvokeDynamic constant pool items.(package private) static final int
The type of the INVOKEDYNAMIC instruction.private ByteVector
The InnerClasses attribute.private int
The number of entries in the InnerClasses attribute.(package private) static final int
The type of CONSTANT_Integer constant pool items.private int
Number of interfaces implemented or extended by this class or interface.private int[]
The interfaces implemented or extended by this class or interface.(package private) boolean
true if the stack map tables of this class are invalid.private AnnotationWriter
The runtime invisible type annotations of this class.(package private) Item[]
The constant pool's hash table data.(package private) static final int
The type of the INVOKEINTERFACE/INVOKEDYNAMIC instruction.(package private) final Item
A reusable key used to look for items in theitems
hash table.(package private) final Item
A reusable key used to look for items in theitems
hash table.(package private) final Item
A reusable key used to look for items in theitems
hash table.(package private) final Item
A reusable key used to look for items in theitems
hash table.(package private) static final int
The type of instructions with a 2 bytes bytecode offset label.(package private) static final int
The type of instructions with a 4 bytes bytecode offset label.(package private) FieldWriter
The fields of this class.(package private) MethodWriter
The methods of this class.(package private) static final int
The type of the LDC instruction.(package private) static final int
The type of the LDC_W and LDC2_W instructions.(package private) static final int
The type of CONSTANT_Long constant pool items.(package private) static final int
The type of the LOOKUPSWITCH instruction.(package private) static final int
The type of the MULTIANEWARRAY instruction.(package private) static final int
The type of CONSTANT_Methodref constant pool items.(package private) static final int
The type of CONSTANT_MethodType constant pool items.private int
The constant pool item that contains the internal name of this class.(package private) static final int
The type of CONSTANT_NameAndType constant pool items.(package private) static final int
The type of instructions without any argument.(package private) final ByteVector
The constant pool of this class.(package private) static final int
The type of instructions with an signed byte argument.(package private) static final int
The type of instructions with an signed short argument.private int
The constant pool item that contains the signature of this class.private ByteVector
The SourceDebug attribute of this class.private int
The index of the constant pool item that contains the name of the source file from which this class was compiled.(package private) static final int
The type of CONSTANT_String constant pool items.private int
The constant pool item that contains the internal name of the super class of this class.(package private) static final int
The type of the TABLESWITCH instruction.private AnnotationWriter
The runtime visible type annotations of this class.(package private) String
The internal name of this class.(package private) int
The threshold of the constant pool's hash table.(package private) static final int
Factor to convert from ACC_SYNTHETIC_ATTRIBUTE to Opcode.ACC_SYNTHETIC.(package private) static final byte[]
The instruction types of all JVM opcodes.(package private) static final int
The type of instructions with a type descriptor argument.(package private) static final int
Merged type Item stored in the ClassWritertypeTable
, instead of the constant pool, in order to avoid clashes with normal constant pool items in the ClassWriter constant pool's hash table.(package private) static final int
Normal type Item stored in the ClassWritertypeTable
, instead of the constant pool, in order to avoid clashes with normal constant pool items in the ClassWriter constant pool's hash table.(package private) static final int
Uninitialized type Item stored in the ClassWritertypeTable
, instead of the constant pool, in order to avoid clashes with normal constant pool items in the ClassWriter constant pool's hash table.private short
Number of elements in thetypeTable
array.(package private) Item[]
A type table used to temporarily store internal names that will not necessarily be stored in the constant pool.(package private) static final int
The type of CONSTANT_Utf8 constant pool items.(package private) static final int
The type of instructions with a local variable index argument.(package private) int
Minor and major version numbers of the class to be generated.(package private) static final int
The type of the WIDE instruction.Fields inherited from class org.eclipse.sisu.space.asm.ClassVisitor
api, cv
-
Constructor Summary
ConstructorsConstructorDescriptionClassWriter
(int flags) Constructs a newClassWriter
object.ClassWriter
(ClassReader classReader, int flags) Constructs a newClassWriter
object and enables optimizations for "mostly add" bytecode transformations. -
Method Summary
Modifier and TypeMethodDescription(package private) int
Adds the given internal name totypeTable
and returns its index.private Item
Adds the given Item totypeTable
.(package private) int
addUninitializedType
(String type, int offset) Adds the given "uninitialized" type totypeTable
and returns its index.private Item
Returns the constant pool's hash table item which is equal to the given item.protected String
getCommonSuperClass
(String type1, String type2) Returns the common super type of the two given types.(package private) int
getMergedType
(int type1, int type2) Returns the index of the common super type of the two given types.int
Adds a class reference to the constant pool of the class being build.(package private) Item
newClassItem
(String value) Adds a class reference to the constant pool of the class being build.int
Adds a number or string constant to the constant pool of the class being build.(package private) Item
newConstItem
(Object cst) Adds a number or string constant to the constant pool of the class being build.(package private) Item
newDouble
(double value) Adds a double to the constant pool of the class being build.int
Adds a field reference to the constant pool of the class being build.(package private) Item
newFieldItem
(String owner, String name, String desc) Adds a field reference to the constant pool of the class being build.(package private) Item
newFloat
(float value) Adds a float to the constant pool of the class being build.int
Adds a handle to the constant pool of the class being build.(package private) Item
newHandleItem
(int tag, String owner, String name, String desc) Adds a handle to the constant pool of the class being build.(package private) Item
newInteger
(int value) Adds an integer to the constant pool of the class being build.int
newInvokeDynamic
(String name, String desc, Handle bsm, Object... bsmArgs) Adds an invokedynamic reference to the constant pool of the class being build.(package private) Item
newInvokeDynamicItem
(String name, String desc, Handle bsm, Object... bsmArgs) Adds an invokedynamic reference to the constant pool of the class being build.(package private) Item
newLong
(long value) Adds a long to the constant pool of the class being build.int
Adds a method reference to the constant pool of the class being build.(package private) Item
newMethodItem
(String owner, String name, String desc, boolean itf) Adds a method reference to the constant pool of the class being build.int
newMethodType
(String methodDesc) Adds a method type reference to the constant pool of the class being build.(package private) Item
newMethodTypeItem
(String methodDesc) Adds a method type reference to the constant pool of the class being build.int
newNameType
(String name, String desc) Adds a name and type to the constant pool of the class being build.(package private) Item
newNameTypeItem
(String name, String desc) Adds a name and type to the constant pool of the class being build.private Item
Adds a string to the constant pool of the class being build.int
Adds an UTF8 string to the constant pool of the class being build.private void
Puts the given item in the constant pool's hash table.private void
put112
(int b1, int b2, int s) Puts two bytes and one short into the constant pool.private void
put122
(int b, int s1, int s2) Puts one byte and two shorts into the constant pool.byte[]
Returns the bytecode of the class that was build with this class writer.final void
visit
(int version, int access, String name, String signature, String superName, String[] interfaces) Visits the header of the class.final AnnotationVisitor
visitAnnotation
(String desc, boolean visible) Visits an annotation of the class.final void
visitAttribute
(Attribute attr) Visits a non standard attribute of the class.final void
visitEnd()
Visits the end of the class.final FieldVisitor
visitField
(int access, String name, String desc, String signature, Object value) Visits a field of the class.final void
visitInnerClass
(String name, String outerName, String innerName, int access) Visits information about an inner class.final MethodVisitor
visitMethod
(int access, String name, String desc, String signature, String[] exceptions) Visits a method of the class.final void
visitOuterClass
(String owner, String name, String desc) Visits the enclosing class of the class.final void
visitSource
(String file, String debug) Visits the source of the class.final AnnotationVisitor
visitTypeAnnotation
(int typeRef, TypePath typePath, String desc, boolean visible) Visits an annotation on a type in the class signature.
-
Field Details
-
COMPUTE_MAXS
public static final int COMPUTE_MAXSFlag to automatically compute the maximum stack size and the maximum number of local variables of methods. If this flag is set, then the arguments of thevisitMaxs
method of theMethodVisitor
returned by thevisitMethod
method will be ignored, and computed automatically from the signature and the bytecode of each method.- See Also:
-
COMPUTE_FRAMES
public static final int COMPUTE_FRAMESFlag to automatically compute the stack map frames of methods from scratch. If this flag is set, then the calls to theMethodVisitor.visitFrame(int, int, java.lang.Object[], int, java.lang.Object[])
method are ignored, and the stack map frames are recomputed from the methods bytecode. The arguments of thevisitMaxs
method are also ignored and recomputed from the bytecode. In other words, computeFrames implies computeMaxs.- See Also:
-
ACC_SYNTHETIC_ATTRIBUTE
static final int ACC_SYNTHETIC_ATTRIBUTEPseudo access flag to distinguish between the synthetic attribute and the synthetic access flag.- See Also:
-
TO_ACC_SYNTHETIC
static final int TO_ACC_SYNTHETICFactor to convert from ACC_SYNTHETIC_ATTRIBUTE to Opcode.ACC_SYNTHETIC.- See Also:
-
NOARG_INSN
static final int NOARG_INSNThe type of instructions without any argument.- See Also:
-
SBYTE_INSN
static final int SBYTE_INSNThe type of instructions with an signed byte argument.- See Also:
-
SHORT_INSN
static final int SHORT_INSNThe type of instructions with an signed short argument.- See Also:
-
VAR_INSN
static final int VAR_INSNThe type of instructions with a local variable index argument.- See Also:
-
IMPLVAR_INSN
static final int IMPLVAR_INSNThe type of instructions with an implicit local variable index argument.- See Also:
-
TYPE_INSN
static final int TYPE_INSNThe type of instructions with a type descriptor argument.- See Also:
-
FIELDORMETH_INSN
static final int FIELDORMETH_INSNThe type of field and method invocations instructions.- See Also:
-
ITFMETH_INSN
static final int ITFMETH_INSNThe type of the INVOKEINTERFACE/INVOKEDYNAMIC instruction.- See Also:
-
INDYMETH_INSN
static final int INDYMETH_INSNThe type of the INVOKEDYNAMIC instruction.- See Also:
-
LABEL_INSN
static final int LABEL_INSNThe type of instructions with a 2 bytes bytecode offset label.- See Also:
-
LABELW_INSN
static final int LABELW_INSNThe type of instructions with a 4 bytes bytecode offset label.- See Also:
-
LDC_INSN
static final int LDC_INSNThe type of the LDC instruction.- See Also:
-
LDCW_INSN
static final int LDCW_INSNThe type of the LDC_W and LDC2_W instructions.- See Also:
-
IINC_INSN
static final int IINC_INSNThe type of the IINC instruction.- See Also:
-
TABL_INSN
static final int TABL_INSNThe type of the TABLESWITCH instruction.- See Also:
-
LOOK_INSN
static final int LOOK_INSNThe type of the LOOKUPSWITCH instruction.- See Also:
-
MANA_INSN
static final int MANA_INSNThe type of the MULTIANEWARRAY instruction.- See Also:
-
WIDE_INSN
static final int WIDE_INSNThe type of the WIDE instruction.- See Also:
-
TYPE
static final byte[] TYPEThe instruction types of all JVM opcodes. -
CLASS
static final int CLASSThe type of CONSTANT_Class constant pool items.- See Also:
-
FIELD
static final int FIELDThe type of CONSTANT_Fieldref constant pool items.- See Also:
-
METH
static final int METHThe type of CONSTANT_Methodref constant pool items.- See Also:
-
IMETH
static final int IMETHThe type of CONSTANT_InterfaceMethodref constant pool items.- See Also:
-
STR
static final int STRThe type of CONSTANT_String constant pool items.- See Also:
-
INT
static final int INTThe type of CONSTANT_Integer constant pool items.- See Also:
-
FLOAT
static final int FLOATThe type of CONSTANT_Float constant pool items.- See Also:
-
LONG
static final int LONGThe type of CONSTANT_Long constant pool items.- See Also:
-
DOUBLE
static final int DOUBLEThe type of CONSTANT_Double constant pool items.- See Also:
-
NAME_TYPE
static final int NAME_TYPEThe type of CONSTANT_NameAndType constant pool items.- See Also:
-
UTF8
static final int UTF8The type of CONSTANT_Utf8 constant pool items.- See Also:
-
MTYPE
static final int MTYPEThe type of CONSTANT_MethodType constant pool items.- See Also:
-
HANDLE
static final int HANDLEThe type of CONSTANT_MethodHandle constant pool items.- See Also:
-
INDY
static final int INDYThe type of CONSTANT_InvokeDynamic constant pool items.- See Also:
-
HANDLE_BASE
static final int HANDLE_BASEThe base value for all CONSTANT_MethodHandle constant pool items. Internally, ASM store the 9 variations of CONSTANT_MethodHandle into 9 different items.- See Also:
-
TYPE_NORMAL
static final int TYPE_NORMALNormal type Item stored in the ClassWritertypeTable
, instead of the constant pool, in order to avoid clashes with normal constant pool items in the ClassWriter constant pool's hash table.- See Also:
-
TYPE_UNINIT
static final int TYPE_UNINITUninitialized type Item stored in the ClassWritertypeTable
, instead of the constant pool, in order to avoid clashes with normal constant pool items in the ClassWriter constant pool's hash table.- See Also:
-
TYPE_MERGED
static final int TYPE_MERGEDMerged type Item stored in the ClassWritertypeTable
, instead of the constant pool, in order to avoid clashes with normal constant pool items in the ClassWriter constant pool's hash table.- See Also:
-
BSM
static final int BSMThe type of BootstrapMethods items. These items are stored in a special class attribute named BootstrapMethods and not in the constant pool.- See Also:
-
cr
ClassReader crThe class reader from which this class writer was constructed, if any. -
version
int versionMinor and major version numbers of the class to be generated. -
index
int indexIndex of the next item to be added in the constant pool. -
pool
The constant pool of this class. -
items
Item[] itemsThe constant pool's hash table data. -
threshold
int thresholdThe threshold of the constant pool's hash table. -
key
A reusable key used to look for items in theitems
hash table. -
key2
A reusable key used to look for items in theitems
hash table. -
key3
A reusable key used to look for items in theitems
hash table. -
key4
A reusable key used to look for items in theitems
hash table. -
typeTable
Item[] typeTableA type table used to temporarily store internal names that will not necessarily be stored in the constant pool. This type table is used by the control flow and data flow analysis algorithm used to compute stack map frames from scratch. This array associates to each index i the Item whose index is i. All Item objects stored in this array are also stored in theitems
hash table. These two arrays allow to retrieve an Item from its index or, conversely, to get the index of an Item from its value. Each Item stores an internal name in itsItem.strVal1
field. -
typeCount
private short typeCountNumber of elements in thetypeTable
array. -
access
private int accessThe access flags of this class. -
name
private int nameThe constant pool item that contains the internal name of this class. -
thisName
String thisNameThe internal name of this class. -
signature
private int signatureThe constant pool item that contains the signature of this class. -
superName
private int superNameThe constant pool item that contains the internal name of the super class of this class. -
interfaceCount
private int interfaceCountNumber of interfaces implemented or extended by this class or interface. -
interfaces
private int[] interfacesThe interfaces implemented or extended by this class or interface. More precisely, this array contains the indexes of the constant pool items that contain the internal names of these interfaces. -
sourceFile
private int sourceFileThe index of the constant pool item that contains the name of the source file from which this class was compiled. -
sourceDebug
The SourceDebug attribute of this class. -
enclosingMethodOwner
private int enclosingMethodOwnerThe constant pool item that contains the name of the enclosing class of this class. -
enclosingMethod
private int enclosingMethodThe constant pool item that contains the name and descriptor of the enclosing method of this class. -
anns
The runtime visible annotations of this class. -
ianns
The runtime invisible annotations of this class. -
tanns
The runtime visible type annotations of this class. -
itanns
The runtime invisible type annotations of this class. -
attrs
The non standard attributes of this class. -
innerClassesCount
private int innerClassesCountThe number of entries in the InnerClasses attribute. -
innerClasses
The InnerClasses attribute. -
bootstrapMethodsCount
int bootstrapMethodsCountThe number of entries in the BootstrapMethods attribute. -
bootstrapMethods
ByteVector bootstrapMethodsThe BootstrapMethods attribute. -
firstField
FieldWriter firstFieldThe fields of this class. These fields are stored in a linked list ofFieldWriter
objects, linked to each other by theirFieldVisitor.fv
field. This field stores the first element of this list. -
lastField
FieldWriter lastFieldThe fields of this class. These fields are stored in a linked list ofFieldWriter
objects, linked to each other by theirFieldVisitor.fv
field. This field stores the last element of this list. -
firstMethod
MethodWriter firstMethodThe methods of this class. These methods are stored in a linked list ofMethodWriter
objects, linked to each other by theirMethodVisitor.mv
field. This field stores the first element of this list. -
lastMethod
MethodWriter lastMethodThe methods of this class. These methods are stored in a linked list ofMethodWriter
objects, linked to each other by theirMethodVisitor.mv
field. This field stores the last element of this list. -
computeMaxs
private boolean computeMaxstrue if the maximum stack size and number of local variables must be automatically computed. -
computeFrames
private boolean computeFramestrue if the stack map frames must be recomputed from scratch. -
invalidFrames
boolean invalidFramestrue if the stack map tables of this class are invalid. TheMethodWriter.resizeInstructions()
method cannot transform existing stack map tables, and so produces potentially invalid classes when it is executed. In this case the class is reread and rewritten with theCOMPUTE_FRAMES
option (the resizeInstructions method can resize stack map tables when this option is used).
-
-
Constructor Details
-
ClassWriter
public ClassWriter(int flags) Constructs a newClassWriter
object.- Parameters:
flags
- option flags that can be used to modify the default behavior of this class. SeeCOMPUTE_MAXS
,COMPUTE_FRAMES
.
-
ClassWriter
Constructs a newClassWriter
object and enables optimizations for "mostly add" bytecode transformations. These optimizations are the following:- 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.flags
- option flags that can be used to modify the default behavior of this class. These option flags do not affect methods that are copied as is in the new class. This means that the maximum stack size nor the stack frames will be computed for these methods. SeeCOMPUTE_MAXS
,COMPUTE_FRAMES
.
-
-
Method Details
-
visit
public final void visit(int version, int access, String name, String signature, String superName, String[] interfaces) Description copied from class:ClassVisitor
Visits the header of the class.- Overrides:
visit
in classClassVisitor
- Parameters:
version
- the class version.access
- the class's access flags (seeOpcodes
). This parameter also indicates if the class is deprecated.name
- the internal name of the class (seegetInternalName
).signature
- the signature of this class. May be null if the class is not a generic one, and does not extend or implement generic classes or interfaces.superName
- the internal of name of the super class (seegetInternalName
). For interfaces, the super class isObject
. May be null, but only for theObject
class.interfaces
- the internal names of the class's interfaces (seegetInternalName
). May be null.
-
visitSource
Description copied from class:ClassVisitor
Visits the source of the class.- Overrides:
visitSource
in classClassVisitor
- Parameters:
file
- the name of the source file from which the class was compiled. May be null.debug
- additional debug information to compute the correspondance between source and compiled elements of the class. May be null.
-
visitOuterClass
Description copied from class:ClassVisitor
Visits the enclosing class of the class. This method must be called only if the class has an enclosing class.- Overrides:
visitOuterClass
in classClassVisitor
- Parameters:
owner
- internal name of the enclosing class of the class.name
- the name of the method that contains the class, or null if the class is not enclosed in a method of its enclosing class.desc
- the descriptor of the method that contains the class, or null if the class is not enclosed in a method of its enclosing class.
-
visitAnnotation
Description copied from class:ClassVisitor
Visits an annotation of the class.- Overrides:
visitAnnotation
in classClassVisitor
- Parameters:
desc
- the class descriptor of the annotation class.visible
- true if the annotation is visible at runtime.- Returns:
- a visitor to visit the annotation values, or null if this visitor is not interested in visiting this annotation.
-
visitTypeAnnotation
public final AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) Description copied from class:ClassVisitor
Visits an annotation on a type in the class signature.- Overrides:
visitTypeAnnotation
in classClassVisitor
- Parameters:
typeRef
- a reference to the annotated type. The sort of this type reference must beCLASS_TYPE_PARAMETER
,CLASS_TYPE_PARAMETER_BOUND
orCLASS_EXTENDS
. SeeTypeReference
.typePath
- the path to the annotated type argument, wildcard bound, array element type, or static inner type within 'typeRef'. May be null if the annotation targets 'typeRef' as a whole.desc
- the class descriptor of the annotation class.visible
- true if the annotation is visible at runtime.- Returns:
- a visitor to visit the annotation values, or null if this visitor is not interested in visiting this annotation.
-
visitAttribute
Description copied from class:ClassVisitor
Visits a non standard attribute of the class.- Overrides:
visitAttribute
in classClassVisitor
- Parameters:
attr
- an attribute.
-
visitInnerClass
Description copied from class:ClassVisitor
Visits information about an inner class. This inner class is not necessarily a member of the class being visited.- Overrides:
visitInnerClass
in classClassVisitor
- Parameters:
name
- the internal name of an inner class (seegetInternalName
).outerName
- the internal name of the class to which the inner class belongs (seegetInternalName
). May be null for not member classes.innerName
- the (simple) name of the inner class inside its enclosing class. May be null for anonymous inner classes.access
- the access flags of the inner class as originally declared in the enclosing class.
-
visitField
public final FieldVisitor visitField(int access, String name, String desc, String signature, Object value) Description copied from class:ClassVisitor
Visits a field of the class.- Overrides:
visitField
in classClassVisitor
- Parameters:
access
- the field's access flags (seeOpcodes
). This parameter also indicates if the field is synthetic and/or deprecated.name
- the field's name.desc
- the field's descriptor (seeType
).signature
- the field's signature. May be null if the field's type does not use generic types.value
- the field's initial value. This parameter, which may be null if the field does not have an initial value, must be anInteger
, aFloat
, aLong
, aDouble
or aString
(for int, float, long or String 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
public final MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) Description copied from class:ClassVisitor
Visits a method of the class. This method must return a newMethodVisitor
instance (or null) 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
). This parameter also indicates if the method is synthetic and/or deprecated.name
- the method's name.desc
- the method's descriptor (seeType
).signature
- the method's signature. May be null if the method parameters, return type and exceptions do not use generic types.exceptions
- the internal names of the method's exception classes (seegetInternalName
). May be null.- 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.
-
visitEnd
public final void visitEnd()Description copied from class:ClassVisitor
Visits the end of the class. This method, which is the last one to be called, is used to inform the visitor that all the fields and methods of the class have been visited.- Overrides:
visitEnd
in classClassVisitor
-
toByteArray
public byte[] toByteArray()Returns the bytecode of the class that was build with this class writer.- Returns:
- the bytecode of the class that was build with this class writer.
-
newConstItem
Adds a number or string constant to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. -
newConst
Adds a number or string constant to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters. -
newUTF8
Adds an UTF8 string to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
value
- the String value.- Returns:
- the index of a new or already existing UTF8 item.
-
newClassItem
Adds a class reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
value
- the internal name of the class.- Returns:
- a new or already existing class reference item.
-
newClass
Adds a class reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
value
- the internal name of the class.- Returns:
- the index of a new or already existing class reference item.
-
newMethodTypeItem
Adds a method type reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
methodDesc
- method descriptor of the method type.- Returns:
- a new or already existing method type reference item.
-
newMethodType
Adds a method type reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
methodDesc
- method descriptor of the method type.- Returns:
- the index of a new or already existing method type reference item.
-
newHandleItem
Adds a handle to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
tag
- the kind of this handle. Must beOpcodes.H_GETFIELD
,Opcodes.H_GETSTATIC
,Opcodes.H_PUTFIELD
,Opcodes.H_PUTSTATIC
,Opcodes.H_INVOKEVIRTUAL
,Opcodes.H_INVOKESTATIC
,Opcodes.H_INVOKESPECIAL
,Opcodes.H_NEWINVOKESPECIAL
orOpcodes.H_INVOKEINTERFACE
.owner
- the internal name of the field or method owner class.name
- the name of the field or method.desc
- the descriptor of the field or method.- Returns:
- a new or an already existing method type reference item.
-
newHandle
Adds a handle to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
tag
- the kind of this handle. Must beOpcodes.H_GETFIELD
,Opcodes.H_GETSTATIC
,Opcodes.H_PUTFIELD
,Opcodes.H_PUTSTATIC
,Opcodes.H_INVOKEVIRTUAL
,Opcodes.H_INVOKESTATIC
,Opcodes.H_INVOKESPECIAL
,Opcodes.H_NEWINVOKESPECIAL
orOpcodes.H_INVOKEINTERFACE
.owner
- the internal name of the field or method owner class.name
- the name of the field or method.desc
- the descriptor of the field or method.- Returns:
- the index of a new or already existing method type reference item.
-
newInvokeDynamicItem
Adds an invokedynamic reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
name
- name of the invoked method.desc
- descriptor of the invoke method.bsm
- the bootstrap method.bsmArgs
- the bootstrap method constant arguments.- Returns:
- a new or an already existing invokedynamic type reference item.
-
newInvokeDynamic
Adds an invokedynamic reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
name
- name of the invoked method.desc
- descriptor of the invoke method.bsm
- the bootstrap method.bsmArgs
- the bootstrap method constant arguments.- Returns:
- the index of a new or already existing invokedynamic reference item.
-
newFieldItem
Adds a field reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item.- Parameters:
owner
- the internal name of the field's owner class.name
- the field's name.desc
- the field's descriptor.- Returns:
- a new or already existing field reference item.
-
newField
Adds a field reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
owner
- the internal name of the field's owner class.name
- the field's name.desc
- the field's descriptor.- Returns:
- the index of a new or already existing field reference item.
-
newMethodItem
Adds a method reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item.- Parameters:
owner
- the internal name of the method's owner class.name
- the method's name.desc
- the method's descriptor.itf
- true if owner is an interface.- Returns:
- a new or already existing method reference item.
-
newMethod
Adds a method reference to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
owner
- the internal name of the method's owner class.name
- the method's name.desc
- the method's descriptor.itf
- true if owner is an interface.- Returns:
- the index of a new or already existing method reference item.
-
newInteger
Adds an integer to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item.- Parameters:
value
- the int value.- Returns:
- a new or already existing int item.
-
newFloat
Adds a float to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item.- Parameters:
value
- the float value.- Returns:
- a new or already existing float item.
-
newLong
Adds a long to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item.- Parameters:
value
- the long value.- Returns:
- a new or already existing long item.
-
newDouble
Adds a double to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item.- Parameters:
value
- the double value.- Returns:
- a new or already existing double item.
-
newString
Adds a string to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item.- Parameters:
value
- the String value.- Returns:
- a new or already existing string item.
-
newNameType
Adds a name and type to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item. This method is intended forAttribute
sub classes, and is normally not needed by class generators or adapters.- Parameters:
name
- a name.desc
- a type descriptor.- Returns:
- the index of a new or already existing name and type item.
-
newNameTypeItem
Adds a name and type to the constant pool of the class being build. Does nothing if the constant pool already contains a similar item.- Parameters:
name
- a name.desc
- a type descriptor.- Returns:
- a new or already existing name and type item.
-
addType
Adds the given internal name totypeTable
and returns its index. Does nothing if the type table already contains this internal name.- Parameters:
type
- the internal name to be added to the type table.- Returns:
- the index of this internal name in the type table.
-
addUninitializedType
Adds the given "uninitialized" type totypeTable
and returns its index. This method is used for UNINITIALIZED types, made of an internal name and a bytecode offset.- Parameters:
type
- the internal name to be added to the type table.offset
- the bytecode offset of the NEW instruction that created this UNINITIALIZED type value.- Returns:
- the index of this internal name in the type table.
-
addType
Adds the given Item totypeTable
.- Parameters:
item
- the value to be added to the type table.- Returns:
- the added Item, which a new Item instance with the same value as the given Item.
-
getMergedType
int getMergedType(int type1, int type2) Returns the index of the common super type of the two given types. This method callsgetCommonSuperClass(java.lang.String, java.lang.String)
and caches the result in theitems
hash table to speedup future calls with the same parameters. -
getCommonSuperClass
Returns the common super type of the two given types. The default implementation of this method loads the two given classes and uses the java.lang.Class methods to find the common super class. It can be overridden to compute this common super type in other ways, in particular without actually loading any class, or to take into account the class that is currently being generated by this ClassWriter, which can of course not be loaded since it is under construction.- Parameters:
type1
- the internal name of a class.type2
- the internal name of another class.- Returns:
- the internal name of the common super class of the two given classes.
-
get
Returns the constant pool's hash table item which is equal to the given item.- Parameters:
key
- a constant pool item.- Returns:
- the constant pool's hash table item which is equal to the given item, or null if there is no such item.
-
put
Puts the given item in the constant pool's hash table. The hash table must not already contains this item.- Parameters:
i
- the item to be added to the constant pool's hash table.
-
put122
private void put122(int b, int s1, int s2) Puts one byte and two shorts into the constant pool.- Parameters:
b
- a byte.s1
- a short.s2
- another short.
-
put112
private void put112(int b1, int b2, int s) Puts two bytes and one short into the constant pool.- Parameters:
b1
- a byte.b2
- another byte.s
- a short.
-