Package org.eclipse.sisu.space.asm
Class ClassWriter
- java.lang.Object
-
- org.eclipse.sisu.space.asm.ClassVisitor
-
- org.eclipse.sisu.space.asm.ClassWriter
-
public final class ClassWriter extends ClassVisitor
AClassVisitor
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 moreClassReader
and adapter class visitor to generate a modified class from one or more existing Java classes.
-
-
Field Summary
Fields Modifier and Type Field Description (package private) static int
ACC_SYNTHETIC_ATTRIBUTE
Pseudo access flag to distinguish between the synthetic attribute and the synthetic access flag.private int
access
The access flags of this class.private AnnotationWriter
anns
The runtime visible annotations of this class.private Attribute
attrs
The non standard attributes of this class.(package private) ByteVector
bootstrapMethods
The BootstrapMethods attribute.(package private) int
bootstrapMethodsCount
The number of entries in the BootstrapMethods attribute.(package private) static int
BSM
The type of BootstrapMethods items.(package private) static int
CLASS
The type of CONSTANT_Class constant pool items.static int
COMPUTE_FRAMES
Flag to automatically compute the stack map frames of methods from scratch.static int
COMPUTE_MAXS
Flag to automatically compute the maximum stack size and the maximum number of local variables of methods.private boolean
computeFrames
true if the stack map frames must be recomputed from scratch.private boolean
computeMaxs
true if the maximum stack size and number of local variables must be automatically computed.(package private) ClassReader
cr
The class reader from which this class writer was constructed, if any.(package private) static int
DOUBLE
The type of CONSTANT_Double constant pool items.private int
enclosingMethod
The constant pool item that contains the name and descriptor of the enclosing method of this class.private int
enclosingMethodOwner
The constant pool item that contains the name of the enclosing class of this class.(package private) static int
FIELD
The type of CONSTANT_Fieldref constant pool items.(package private) static int
FIELDORMETH_INSN
The type of field and method invocations instructions.(package private) FieldWriter
firstField
The fields of this class.(package private) MethodWriter
firstMethod
The methods of this class.(package private) static int
FLOAT
The type of CONSTANT_Float constant pool items.(package private) static int
HANDLE
The type of CONSTANT_MethodHandle constant pool items.(package private) static int
HANDLE_BASE
The base value for all CONSTANT_MethodHandle constant pool items.private AnnotationWriter
ianns
The runtime invisible annotations of this class.(package private) static int
IINC_INSN
The type of the IINC instruction.(package private) static int
IMETH
The type of CONSTANT_InterfaceMethodref constant pool items.(package private) static int
IMPLVAR_INSN
The type of instructions with an implicit local variable index argument.(package private) int
index
Index of the next item to be added in the constant pool.(package private) static int
INDY
The type of CONSTANT_InvokeDynamic constant pool items.(package private) static int
INDYMETH_INSN
The type of the INVOKEDYNAMIC instruction.private ByteVector
innerClasses
The InnerClasses attribute.private int
innerClassesCount
The number of entries in the InnerClasses attribute.(package private) static int
INT
The type of CONSTANT_Integer constant pool items.private int
interfaceCount
Number of interfaces implemented or extended by this class or interface.private int[]
interfaces
The interfaces implemented or extended by this class or interface.(package private) boolean
invalidFrames
true if the stack map tables of this class are invalid.private AnnotationWriter
itanns
The runtime invisible type annotations of this class.(package private) Item[]
items
The constant pool's hash table data.(package private) static int
ITFMETH_INSN
The type of the INVOKEINTERFACE/INVOKEDYNAMIC instruction.(package private) Item
key
A reusable key used to look for items in theitems
hash table.(package private) Item
key2
A reusable key used to look for items in theitems
hash table.(package private) Item
key3
A reusable key used to look for items in theitems
hash table.(package private) Item
key4
A reusable key used to look for items in theitems
hash table.(package private) static int
LABEL_INSN
The type of instructions with a 2 bytes bytecode offset label.(package private) static int
LABELW_INSN
The type of instructions with a 4 bytes bytecode offset label.(package private) FieldWriter
lastField
The fields of this class.(package private) MethodWriter
lastMethod
The methods of this class.(package private) static int
LDC_INSN
The type of the LDC instruction.(package private) static int
LDCW_INSN
The type of the LDC_W and LDC2_W instructions.(package private) static int
LONG
The type of CONSTANT_Long constant pool items.(package private) static int
LOOK_INSN
The type of the LOOKUPSWITCH instruction.(package private) static int
MANA_INSN
The type of the MULTIANEWARRAY instruction.(package private) static int
METH
The type of CONSTANT_Methodref constant pool items.(package private) static int
MTYPE
The type of CONSTANT_MethodType constant pool items.private int
name
The constant pool item that contains the internal name of this class.(package private) static int
NAME_TYPE
The type of CONSTANT_NameAndType constant pool items.(package private) static int
NOARG_INSN
The type of instructions without any argument.(package private) ByteVector
pool
The constant pool of this class.(package private) static int
SBYTE_INSN
The type of instructions with an signed byte argument.(package private) static int
SHORT_INSN
The type of instructions with an signed short argument.private int
signature
The constant pool item that contains the signature of this class.private ByteVector
sourceDebug
The SourceDebug attribute of this class.private int
sourceFile
The index of the constant pool item that contains the name of the source file from which this class was compiled.(package private) static int
STR
The type of CONSTANT_String constant pool items.private int
superName
The constant pool item that contains the internal name of the super class of this class.(package private) static int
TABL_INSN
The type of the TABLESWITCH instruction.private AnnotationWriter
tanns
The runtime visible type annotations of this class.(package private) java.lang.String
thisName
The internal name of this class.(package private) int
threshold
The threshold of the constant pool's hash table.(package private) static int
TO_ACC_SYNTHETIC
Factor to convert from ACC_SYNTHETIC_ATTRIBUTE to Opcode.ACC_SYNTHETIC.(package private) static byte[]
TYPE
The instruction types of all JVM opcodes.(package private) static int
TYPE_INSN
The type of instructions with a type descriptor argument.(package private) static int
TYPE_MERGED
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 int
TYPE_NORMAL
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 int
TYPE_UNINIT
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
typeCount
Number of elements in thetypeTable
array.(package private) Item[]
typeTable
A type table used to temporarily store internal names that will not necessarily be stored in the constant pool.(package private) static int
UTF8
The type of CONSTANT_Utf8 constant pool items.(package private) static int
VAR_INSN
The type of instructions with a local variable index argument.(package private) int
version
Minor and major version numbers of the class to be generated.(package private) static int
WIDE_INSN
The type of the WIDE instruction.-
Fields inherited from class org.eclipse.sisu.space.asm.ClassVisitor
api, cv
-
-
Constructor Summary
Constructors Constructor Description ClassWriter(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
All Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) int
addType(java.lang.String type)
Adds the given internal name totypeTable
and returns its index.private Item
addType(Item item)
Adds the given Item totypeTable
.(package private) int
addUninitializedType(java.lang.String type, int offset)
Adds the given "uninitialized" type totypeTable
and returns its index.private Item
get(Item key)
Returns the constant pool's hash table item which is equal to the given item.protected java.lang.String
getCommonSuperClass(java.lang.String type1, java.lang.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
newClass(java.lang.String value)
Adds a class reference to the constant pool of the class being build.(package private) Item
newClassItem(java.lang.String value)
Adds a class reference to the constant pool of the class being build.int
newConst(java.lang.Object cst)
Adds a number or string constant to the constant pool of the class being build.(package private) Item
newConstItem(java.lang.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
newField(java.lang.String owner, java.lang.String name, java.lang.String desc)
Adds a field reference to the constant pool of the class being build.(package private) Item
newFieldItem(java.lang.String owner, java.lang.String name, java.lang.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
newHandle(int tag, java.lang.String owner, java.lang.String name, java.lang.String desc)
Adds a handle to the constant pool of the class being build.(package private) Item
newHandleItem(int tag, java.lang.String owner, java.lang.String name, java.lang.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(java.lang.String name, java.lang.String desc, Handle bsm, java.lang.Object... bsmArgs)
Adds an invokedynamic reference to the constant pool of the class being build.(package private) Item
newInvokeDynamicItem(java.lang.String name, java.lang.String desc, Handle bsm, java.lang.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
newMethod(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean itf)
Adds a method reference to the constant pool of the class being build.(package private) Item
newMethodItem(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean itf)
Adds a method reference to the constant pool of the class being build.int
newMethodType(java.lang.String methodDesc)
Adds a method type reference to the constant pool of the class being build.(package private) Item
newMethodTypeItem(java.lang.String methodDesc)
Adds a method type reference to the constant pool of the class being build.int
newNameType(java.lang.String name, java.lang.String desc)
Adds a name and type to the constant pool of the class being build.(package private) Item
newNameTypeItem(java.lang.String name, java.lang.String desc)
Adds a name and type to the constant pool of the class being build.private Item
newString(java.lang.String value)
Adds a string to the constant pool of the class being build.int
newUTF8(java.lang.String value)
Adds an UTF8 string to the constant pool of the class being build.private void
put(Item i)
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[]
toByteArray()
Returns the bytecode of the class that was build with this class writer.void
visit(int version, int access, java.lang.String name, java.lang.String signature, java.lang.String superName, java.lang.String[] interfaces)
Visits the header of the class.AnnotationVisitor
visitAnnotation(java.lang.String desc, boolean visible)
Visits an annotation of the class.void
visitAttribute(Attribute attr)
Visits a non standard attribute of the class.void
visitEnd()
Visits the end of the class.FieldVisitor
visitField(int access, java.lang.String name, java.lang.String desc, java.lang.String signature, java.lang.Object value)
Visits a field of the class.void
visitInnerClass(java.lang.String name, java.lang.String outerName, java.lang.String innerName, int access)
Visits information about an inner class.MethodVisitor
visitMethod(int access, java.lang.String name, java.lang.String desc, java.lang.String signature, java.lang.String[] exceptions)
Visits a method of the class.void
visitOuterClass(java.lang.String owner, java.lang.String name, java.lang.String desc)
Visits the enclosing class of the class.void
visitSource(java.lang.String file, java.lang.String debug)
Visits the source of the class.AnnotationVisitor
visitTypeAnnotation(int typeRef, TypePath typePath, java.lang.String desc, boolean visible)
Visits an annotation on a type in the class signature.
-
-
-
Field Detail
-
COMPUTE_MAXS
public static final int COMPUTE_MAXS
Flag 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:
ClassWriter(int)
, Constant Field Values
-
COMPUTE_FRAMES
public static final int COMPUTE_FRAMES
Flag 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:
ClassWriter(int)
, Constant Field Values
-
ACC_SYNTHETIC_ATTRIBUTE
static final int ACC_SYNTHETIC_ATTRIBUTE
Pseudo access flag to distinguish between the synthetic attribute and the synthetic access flag.- See Also:
- Constant Field Values
-
TO_ACC_SYNTHETIC
static final int TO_ACC_SYNTHETIC
Factor to convert from ACC_SYNTHETIC_ATTRIBUTE to Opcode.ACC_SYNTHETIC.- See Also:
- Constant Field Values
-
NOARG_INSN
static final int NOARG_INSN
The type of instructions without any argument.- See Also:
- Constant Field Values
-
SBYTE_INSN
static final int SBYTE_INSN
The type of instructions with an signed byte argument.- See Also:
- Constant Field Values
-
SHORT_INSN
static final int SHORT_INSN
The type of instructions with an signed short argument.- See Also:
- Constant Field Values
-
VAR_INSN
static final int VAR_INSN
The type of instructions with a local variable index argument.- See Also:
- Constant Field Values
-
IMPLVAR_INSN
static final int IMPLVAR_INSN
The type of instructions with an implicit local variable index argument.- See Also:
- Constant Field Values
-
TYPE_INSN
static final int TYPE_INSN
The type of instructions with a type descriptor argument.- See Also:
- Constant Field Values
-
FIELDORMETH_INSN
static final int FIELDORMETH_INSN
The type of field and method invocations instructions.- See Also:
- Constant Field Values
-
ITFMETH_INSN
static final int ITFMETH_INSN
The type of the INVOKEINTERFACE/INVOKEDYNAMIC instruction.- See Also:
- Constant Field Values
-
INDYMETH_INSN
static final int INDYMETH_INSN
The type of the INVOKEDYNAMIC instruction.- See Also:
- Constant Field Values
-
LABEL_INSN
static final int LABEL_INSN
The type of instructions with a 2 bytes bytecode offset label.- See Also:
- Constant Field Values
-
LABELW_INSN
static final int LABELW_INSN
The type of instructions with a 4 bytes bytecode offset label.- See Also:
- Constant Field Values
-
LDC_INSN
static final int LDC_INSN
The type of the LDC instruction.- See Also:
- Constant Field Values
-
LDCW_INSN
static final int LDCW_INSN
The type of the LDC_W and LDC2_W instructions.- See Also:
- Constant Field Values
-
IINC_INSN
static final int IINC_INSN
The type of the IINC instruction.- See Also:
- Constant Field Values
-
TABL_INSN
static final int TABL_INSN
The type of the TABLESWITCH instruction.- See Also:
- Constant Field Values
-
LOOK_INSN
static final int LOOK_INSN
The type of the LOOKUPSWITCH instruction.- See Also:
- Constant Field Values
-
MANA_INSN
static final int MANA_INSN
The type of the MULTIANEWARRAY instruction.- See Also:
- Constant Field Values
-
WIDE_INSN
static final int WIDE_INSN
The type of the WIDE instruction.- See Also:
- Constant Field Values
-
TYPE
static final byte[] TYPE
The instruction types of all JVM opcodes.
-
CLASS
static final int CLASS
The type of CONSTANT_Class constant pool items.- See Also:
- Constant Field Values
-
FIELD
static final int FIELD
The type of CONSTANT_Fieldref constant pool items.- See Also:
- Constant Field Values
-
METH
static final int METH
The type of CONSTANT_Methodref constant pool items.- See Also:
- Constant Field Values
-
IMETH
static final int IMETH
The type of CONSTANT_InterfaceMethodref constant pool items.- See Also:
- Constant Field Values
-
STR
static final int STR
The type of CONSTANT_String constant pool items.- See Also:
- Constant Field Values
-
INT
static final int INT
The type of CONSTANT_Integer constant pool items.- See Also:
- Constant Field Values
-
FLOAT
static final int FLOAT
The type of CONSTANT_Float constant pool items.- See Also:
- Constant Field Values
-
LONG
static final int LONG
The type of CONSTANT_Long constant pool items.- See Also:
- Constant Field Values
-
DOUBLE
static final int DOUBLE
The type of CONSTANT_Double constant pool items.- See Also:
- Constant Field Values
-
NAME_TYPE
static final int NAME_TYPE
The type of CONSTANT_NameAndType constant pool items.- See Also:
- Constant Field Values
-
UTF8
static final int UTF8
The type of CONSTANT_Utf8 constant pool items.- See Also:
- Constant Field Values
-
MTYPE
static final int MTYPE
The type of CONSTANT_MethodType constant pool items.- See Also:
- Constant Field Values
-
HANDLE
static final int HANDLE
The type of CONSTANT_MethodHandle constant pool items.- See Also:
- Constant Field Values
-
INDY
static final int INDY
The type of CONSTANT_InvokeDynamic constant pool items.- See Also:
- Constant Field Values
-
HANDLE_BASE
static final int HANDLE_BASE
The base value for all CONSTANT_MethodHandle constant pool items. Internally, ASM store the 9 variations of CONSTANT_MethodHandle into 9 different items.- See Also:
- Constant Field Values
-
TYPE_NORMAL
static final int TYPE_NORMAL
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.- See Also:
- Constant Field Values
-
TYPE_UNINIT
static final int TYPE_UNINIT
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.- See Also:
- Constant Field Values
-
TYPE_MERGED
static final int TYPE_MERGED
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.- See Also:
- Constant Field Values
-
BSM
static final int BSM
The type of BootstrapMethods items. These items are stored in a special class attribute named BootstrapMethods and not in the constant pool.- See Also:
- Constant Field Values
-
cr
ClassReader cr
The class reader from which this class writer was constructed, if any.
-
version
int version
Minor and major version numbers of the class to be generated.
-
index
int index
Index of the next item to be added in the constant pool.
-
pool
final ByteVector pool
The constant pool of this class.
-
items
Item[] items
The constant pool's hash table data.
-
threshold
int threshold
The threshold of the constant pool's hash table.
-
typeTable
Item[] typeTable
A 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 typeCount
Number of elements in thetypeTable
array.
-
access
private int access
The access flags of this class.
-
name
private int name
The constant pool item that contains the internal name of this class.
-
thisName
java.lang.String thisName
The internal name of this class.
-
signature
private int signature
The constant pool item that contains the signature of this class.
-
superName
private int superName
The constant pool item that contains the internal name of the super class of this class.
-
interfaceCount
private int interfaceCount
Number of interfaces implemented or extended by this class or interface.
-
interfaces
private int[] interfaces
The 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 sourceFile
The index of the constant pool item that contains the name of the source file from which this class was compiled.
-
sourceDebug
private ByteVector sourceDebug
The SourceDebug attribute of this class.
-
enclosingMethodOwner
private int enclosingMethodOwner
The constant pool item that contains the name of the enclosing class of this class.
-
enclosingMethod
private int enclosingMethod
The constant pool item that contains the name and descriptor of the enclosing method of this class.
-
anns
private AnnotationWriter anns
The runtime visible annotations of this class.
-
ianns
private AnnotationWriter ianns
The runtime invisible annotations of this class.
-
tanns
private AnnotationWriter tanns
The runtime visible type annotations of this class.
-
itanns
private AnnotationWriter itanns
The runtime invisible type annotations of this class.
-
attrs
private Attribute attrs
The non standard attributes of this class.
-
innerClassesCount
private int innerClassesCount
The number of entries in the InnerClasses attribute.
-
innerClasses
private ByteVector innerClasses
The InnerClasses attribute.
-
bootstrapMethodsCount
int bootstrapMethodsCount
The number of entries in the BootstrapMethods attribute.
-
bootstrapMethods
ByteVector bootstrapMethods
The BootstrapMethods attribute.
-
firstField
FieldWriter firstField
The 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 lastField
The 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 firstMethod
The 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 lastMethod
The 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 computeMaxs
true if the maximum stack size and number of local variables must be automatically computed.
-
computeFrames
private boolean computeFrames
true if the stack map frames must be recomputed from scratch.
-
invalidFrames
boolean invalidFrames
true 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 Detail
-
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
public ClassWriter(ClassReader classReader, int flags)
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 Detail
-
visit
public final void visit(int version, int access, java.lang.String name, java.lang.String signature, java.lang.String superName, java.lang.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
public final void visitSource(java.lang.String file, java.lang.String debug)
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
public final void visitOuterClass(java.lang.String owner, java.lang.String name, java.lang.String desc)
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
public final AnnotationVisitor visitAnnotation(java.lang.String desc, boolean visible)
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, java.lang.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
public final void visitAttribute(Attribute attr)
Description copied from class:ClassVisitor
Visits a non standard attribute of the class.- Overrides:
visitAttribute
in classClassVisitor
- Parameters:
attr
- an attribute.
-
visitInnerClass
public final void visitInnerClass(java.lang.String name, java.lang.String outerName, java.lang.String innerName, int access)
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, java.lang.String name, java.lang.String desc, java.lang.String signature, java.lang.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, java.lang.String name, java.lang.String desc, java.lang.String signature, java.lang.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
Item newConstItem(java.lang.Object cst)
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.- Parameters:
cst
- the value of the constant to be added to the constant pool. This parameter must be anInteger
, aFloat
, aLong
, aDouble
, aString
or aType
.- Returns:
- a new or already existing constant item with the given value.
-
newConst
public int newConst(java.lang.Object cst)
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.- Parameters:
cst
- the value of the constant to be added to the constant pool. This parameter must be anInteger
, aFloat
, aLong
, aDouble
or aString
.- Returns:
- the index of a new or already existing constant item with the given value.
-
newUTF8
public int newUTF8(java.lang.String value)
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
Item newClassItem(java.lang.String value)
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
public int newClass(java.lang.String value)
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
Item newMethodTypeItem(java.lang.String methodDesc)
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
public int newMethodType(java.lang.String methodDesc)
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
Item newHandleItem(int tag, java.lang.String owner, java.lang.String name, java.lang.String desc)
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
public int newHandle(int tag, java.lang.String owner, java.lang.String name, java.lang.String desc)
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
Item newInvokeDynamicItem(java.lang.String name, java.lang.String desc, Handle bsm, java.lang.Object... bsmArgs)
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
public int newInvokeDynamic(java.lang.String name, java.lang.String desc, Handle bsm, java.lang.Object... bsmArgs)
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
Item newFieldItem(java.lang.String owner, java.lang.String name, java.lang.String desc)
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
public int newField(java.lang.String owner, java.lang.String name, java.lang.String desc)
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
Item newMethodItem(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean itf)
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
public int newMethod(java.lang.String owner, java.lang.String name, java.lang.String desc, boolean itf)
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
Item newInteger(int value)
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
Item newFloat(float value)
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
Item newLong(long value)
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
Item newDouble(double value)
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
private Item newString(java.lang.String value)
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
public int newNameType(java.lang.String name, java.lang.String desc)
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
Item newNameTypeItem(java.lang.String name, java.lang.String desc)
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
int addType(java.lang.String type)
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
int addUninitializedType(java.lang.String type, int offset)
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
private Item addType(Item item)
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
protected java.lang.String getCommonSuperClass(java.lang.String type1, java.lang.String type2)
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
private Item get(Item key)
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
private void put(Item i)
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.
-
-