Class 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 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 the items hash table.
      (package private) Item key2
      A reusable key used to look for items in the items hash table.
      (package private) Item key3
      A reusable key used to look for items in the items hash table.
      (package private) Item key4
      A reusable key used to look for items in the items 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 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 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.
      (package private) static 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.
      private short typeCount
      Number of elements in the typeTable 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.
    • 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

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      (package private) int addType​(java.lang.String type)
      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​(java.lang.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 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.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • 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 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:
        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
      • 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 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:
        Constant Field Values
      • 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:
        Constant Field Values
      • 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:
        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.
      • 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

        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 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 Detail

      • 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 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 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​(java.lang.String file,
                                      java.lang.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​(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 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​(java.lang.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,
                                                           java.lang.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​(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 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,
                                             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 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,
                                               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 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​(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 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​(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 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​(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 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​(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 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​(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 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​(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 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​(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 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.
      • 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 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​(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 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​(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 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​(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 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​(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 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​(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 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​(java.lang.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 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.