Class ClassWriter

java.lang.Object
org.eclipse.sisu.space.asm.ClassVisitor
org.eclipse.sisu.space.asm.ClassWriter

public final class ClassWriter extends ClassVisitor
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

    Fields
    Modifier and Type
    Field
    Description
    (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.
    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.
    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.
    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 the items hash table.
    (package private) final Item
    A reusable key used to look for items in the items hash table.
    (package private) final Item
    A reusable key used to look for items in the items hash table.
    (package private) final Item
    A reusable key used to look for items in the items 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.
    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 ClassWriter typeTable, 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 ClassWriter typeTable, 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 ClassWriter typeTable, 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 the typeTable 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

    Constructors
    Constructor
    Description
    ClassWriter(int flags)
    Constructs a new ClassWriter object.
    ClassWriter(ClassReader classReader, int flags)
    Constructs a new ClassWriter object and enables optimizations for "mostly add" bytecode transformations.
  • Method Summary

    Modifier and Type
    Method
    Description
    (package private) int
    Adds the given internal name to typeTable and returns its index.
    private Item
    addType(Item item)
    Adds the given Item to typeTable.
    (package private) int
    addUninitializedType(String type, int offset)
    Adds the given "uninitialized" type to typeTable 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 String
    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
    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
    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(String owner, String name, String desc)
    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
    newHandle(int tag, String owner, String name, String desc)
    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
    newMethod(String owner, String name, String desc, boolean itf)
    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
    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
    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
    newUTF8(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[]
    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.
    visitAnnotation(String desc, boolean visible)
    Visits an annotation of the class.
    final void
    Visits a non standard attribute of the class.
    final void
    Visits the end of the class.
    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.
    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.
    visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible)
    Visits an annotation on a type in the class signature.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • 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 the visitMaxs method of the MethodVisitor returned by the visitMethod 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_FRAMES
      Flag to automatically compute the stack map frames of methods from scratch. If this flag is set, then the calls to the MethodVisitor.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 the visitMaxs 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_ATTRIBUTE
      Pseudo access flag to distinguish between the synthetic attribute and the synthetic access flag.
      See Also:
    • TO_ACC_SYNTHETIC

      static final int TO_ACC_SYNTHETIC
      Factor to convert from ACC_SYNTHETIC_ATTRIBUTE to Opcode.ACC_SYNTHETIC.
      See Also:
    • NOARG_INSN

      static final int NOARG_INSN
      The type of instructions without any argument.
      See Also:
    • SBYTE_INSN

      static final int SBYTE_INSN
      The type of instructions with an signed byte argument.
      See Also:
    • SHORT_INSN

      static final int SHORT_INSN
      The type of instructions with an signed short argument.
      See Also:
    • VAR_INSN

      static final int VAR_INSN
      The type of instructions with a local variable index argument.
      See Also:
    • IMPLVAR_INSN

      static final int IMPLVAR_INSN
      The type of instructions with an implicit local variable index argument.
      See Also:
    • TYPE_INSN

      static final int TYPE_INSN
      The type of instructions with a type descriptor argument.
      See Also:
    • FIELDORMETH_INSN

      static final int FIELDORMETH_INSN
      The type of field and method invocations instructions.
      See Also:
    • ITFMETH_INSN

      static final int ITFMETH_INSN
      The type of the INVOKEINTERFACE/INVOKEDYNAMIC instruction.
      See Also:
    • INDYMETH_INSN

      static final int INDYMETH_INSN
      The type of the INVOKEDYNAMIC instruction.
      See Also:
    • LABEL_INSN

      static final int LABEL_INSN
      The type of instructions with a 2 bytes bytecode offset label.
      See Also:
    • LABELW_INSN

      static final int LABELW_INSN
      The type of instructions with a 4 bytes bytecode offset label.
      See Also:
    • LDC_INSN

      static final int LDC_INSN
      The type of the LDC instruction.
      See Also:
    • LDCW_INSN

      static final int LDCW_INSN
      The type of the LDC_W and LDC2_W instructions.
      See Also:
    • IINC_INSN

      static final int IINC_INSN
      The type of the IINC instruction.
      See Also:
    • TABL_INSN

      static final int TABL_INSN
      The type of the TABLESWITCH instruction.
      See Also:
    • LOOK_INSN

      static final int LOOK_INSN
      The type of the LOOKUPSWITCH instruction.
      See Also:
    • MANA_INSN

      static final int MANA_INSN
      The type of the MULTIANEWARRAY instruction.
      See Also:
    • WIDE_INSN

      static final int WIDE_INSN
      The type of the WIDE instruction.
      See Also:
    • 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:
    • FIELD

      static final int FIELD
      The type of CONSTANT_Fieldref constant pool items.
      See Also:
    • METH

      static final int METH
      The type of CONSTANT_Methodref constant pool items.
      See Also:
    • IMETH

      static final int IMETH
      The type of CONSTANT_InterfaceMethodref constant pool items.
      See Also:
    • STR

      static final int STR
      The type of CONSTANT_String constant pool items.
      See Also:
    • INT

      static final int INT
      The type of CONSTANT_Integer constant pool items.
      See Also:
    • FLOAT

      static final int FLOAT
      The type of CONSTANT_Float constant pool items.
      See Also:
    • LONG

      static final int LONG
      The type of CONSTANT_Long constant pool items.
      See Also:
    • DOUBLE

      static final int DOUBLE
      The type of CONSTANT_Double constant pool items.
      See Also:
    • NAME_TYPE

      static final int NAME_TYPE
      The type of CONSTANT_NameAndType constant pool items.
      See Also:
    • UTF8

      static final int UTF8
      The type of CONSTANT_Utf8 constant pool items.
      See Also:
    • MTYPE

      static final int MTYPE
      The type of CONSTANT_MethodType constant pool items.
      See Also:
    • HANDLE

      static final int HANDLE
      The type of CONSTANT_MethodHandle constant pool items.
      See Also:
    • INDY

      static final int INDY
      The type of CONSTANT_InvokeDynamic constant pool items.
      See Also:
    • 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:
    • TYPE_NORMAL

      static final int TYPE_NORMAL
      Normal type Item stored in the ClassWriter typeTable, 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_UNINIT
      Uninitialized type Item stored in the ClassWriter typeTable, 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_MERGED
      Merged type Item stored in the ClassWriter typeTable, 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 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:
    • 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.
    • key

      final Item key
      A reusable key used to look for items in the items hash table.
    • key2

      final Item key2
      A reusable key used to look for items in the items hash table.
    • key3

      final Item key3
      A reusable key used to look for items in the items hash table.
    • key4

      final Item key4
      A reusable key used to look for items in the items 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 the items 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 its Item.strVal1 field.
    • typeCount

      private short typeCount
      Number of elements in the typeTable 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

      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 of FieldWriter objects, linked to each other by their FieldVisitor.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 of FieldWriter objects, linked to each other by their FieldVisitor.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 of MethodWriter objects, linked to each other by their MethodVisitor.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 of MethodWriter objects, linked to each other by their MethodVisitor.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. The MethodWriter.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 the COMPUTE_FRAMES option (the resizeInstructions method can resize stack map tables when this option is used).
  • Constructor Details

    • ClassWriter

      public ClassWriter(int flags)
      Constructs a new ClassWriter object.
      Parameters:
      flags - option flags that can be used to modify the default behavior of this class. See COMPUTE_MAXS, COMPUTE_FRAMES.
    • ClassWriter

      public ClassWriter(ClassReader classReader, int flags)
      Constructs a new ClassWriter 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 receives MethodVisitor objects that come from a ClassWriter (and not from any other ClassVisitor instance).
      Parameters:
      classReader - the ClassReader 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. See COMPUTE_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 class ClassVisitor
      Parameters:
      version - the class version.
      access - the class's access flags (see Opcodes). This parameter also indicates if the class is deprecated.
      name - the internal name of the class (see getInternalName).
      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 (see getInternalName). For interfaces, the super class is Object. May be null, but only for the Object class.
      interfaces - the internal names of the class's interfaces (see getInternalName). May be null.
    • visitSource

      public final void visitSource(String file, String debug)
      Description copied from class: ClassVisitor
      Visits the source of the class.
      Overrides:
      visitSource in class ClassVisitor
      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(String owner, String name, 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 class ClassVisitor
      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(String desc, boolean visible)
      Description copied from class: ClassVisitor
      Visits an annotation of the class.
      Overrides:
      visitAnnotation in class ClassVisitor
      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 class ClassVisitor
      Parameters:
      typeRef - a reference to the annotated type. The sort of this type reference must be CLASS_TYPE_PARAMETER, CLASS_TYPE_PARAMETER_BOUND or CLASS_EXTENDS. See TypeReference.
      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 class ClassVisitor
      Parameters:
      attr - an attribute.
    • visitInnerClass

      public final void visitInnerClass(String name, String outerName, 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 class ClassVisitor
      Parameters:
      name - the internal name of an inner class (see getInternalName).
      outerName - the internal name of the class to which the inner class belongs (see getInternalName). 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 class ClassVisitor
      Parameters:
      access - the field's access flags (see Opcodes). This parameter also indicates if the field is synthetic and/or deprecated.
      name - the field's name.
      desc - the field's descriptor (see Type).
      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 an Integer, a Float, a Long, a Double or a String (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 new MethodVisitor instance (or null) each time it is called, i.e., it should not return a previously returned visitor.
      Overrides:
      visitMethod in class ClassVisitor
      Parameters:
      access - the method's access flags (see Opcodes). This parameter also indicates if the method is synthetic and/or deprecated.
      name - the method's name.
      desc - the method's descriptor (see Type).
      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 (see getInternalName). 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 class ClassVisitor
    • 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(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 an Integer, a Float, a Long, a Double, a String or a Type.
      Returns:
      a new or already existing constant item with the given value.
    • newConst

      public int newConst(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 for Attribute 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 an Integer, a Float, a Long, a Double or a String.
      Returns:
      the index of a new or already existing constant item with the given value.
    • newUTF8

      public int newUTF8(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 for Attribute 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(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 for Attribute 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(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 for Attribute 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(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 for Attribute 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(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 for Attribute 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, String owner, String name, 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 for Attribute sub classes, and is normally not needed by class generators or adapters.
      Parameters:
      tag - the kind of this handle. Must be Opcodes.H_GETFIELD, Opcodes.H_GETSTATIC, Opcodes.H_PUTFIELD, Opcodes.H_PUTSTATIC, Opcodes.H_INVOKEVIRTUAL, Opcodes.H_INVOKESTATIC, Opcodes.H_INVOKESPECIAL, Opcodes.H_NEWINVOKESPECIAL or Opcodes.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, String owner, String name, 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 for Attribute sub classes, and is normally not needed by class generators or adapters.
      Parameters:
      tag - the kind of this handle. Must be Opcodes.H_GETFIELD, Opcodes.H_GETSTATIC, Opcodes.H_PUTFIELD, Opcodes.H_PUTSTATIC, Opcodes.H_INVOKEVIRTUAL, Opcodes.H_INVOKESTATIC, Opcodes.H_INVOKESPECIAL, Opcodes.H_NEWINVOKESPECIAL or Opcodes.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(String name, String desc, Handle bsm, 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 for Attribute 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(String name, String desc, Handle bsm, 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 for Attribute 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(String owner, String name, 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(String owner, String name, 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 for Attribute 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(String owner, String name, 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(String owner, String name, 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 for Attribute 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(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(String name, 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 for Attribute 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(String name, 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(String type)
      Adds the given internal name to typeTable 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(String type, int offset)
      Adds the given "uninitialized" type to typeTable 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 to typeTable.
      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 calls getCommonSuperClass(java.lang.String, java.lang.String) and caches the result in the items hash table to speedup future calls with the same parameters.
      Parameters:
      type1 - index of an internal name in typeTable.
      type2 - index of an internal name in typeTable.
      Returns:
      the index of the common super type of the two given types.
    • getCommonSuperClass

      protected String getCommonSuperClass(String type1, 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.