org.mozilla.classfile

## Class ClassFileWriter

- java.lang.Object
- - org.mozilla.classfile.ClassFileWriter

-     public class ClassFileWriter
      extends java.lang.Object

  ClassFileWriter A ClassFileWriter is used to write a Java class file. Methods are provided to create fields and methods, and within methods to write Java bytecodes.
  Author:
    Roger Lawrence

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class and Description
    --- | ---
    `static class` | `ClassFileWriter.ClassFileFormatException` Thrown for cases where the error in generating the class file is due to a program size constraints rather than a likely bug in the compiler.

  - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `static short` | `ACC_ABSTRACT`
    `static short` | `ACC_FINAL`
    `static short` | `ACC_NATIVE`
    `static short` | `ACC_PRIVATE`
    `static short` | `ACC_PROTECTED`
    `static short` | `ACC_PUBLIC`
    `static short` | `ACC_STATIC`
    `static short` | `ACC_SUPER`
    `static short` | `ACC_SYNCHRONIZED`
    `static short` | `ACC_TRANSIENT`
    `static short` | `ACC_VOLATILE`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `ClassFileWriter(java.lang.String className, java.lang.String superClassName, java.lang.String sourceFileName)` Construct a ClassFileWriter for a class.

  - ### Method Summary

    All Methods Static Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `int` | `acquireLabel()`
    `void` | `add(int theOpCode)` Add the single-byte opcode to the current method.
    `void` | `add(int theOpCode, int theOperand)` Add a single-operand opcode to the current method.
    `void` | `add(int theOpCode, int theOperand1, int theOperand2)` Add the given two-operand bytecode to the current method.
    `void` | `add(int theOpCode, java.lang.String className)`
    `void` | `add(int theOpCode, java.lang.String className, java.lang.String fieldName, java.lang.String fieldType)`
    `void` | `addALoad(int local)` Load object from the given local into stack.
    `void` | `addAStore(int local)` Store object from stack top into the given local.
    `void` | `addDLoad(int local)` Load double from the given local into stack.
    `void` | `addDStore(int local)` Store double from stack top into the given local.
    `void` | `addExceptionHandler(int startLabel, int endLabel, int handlerLabel, java.lang.String catchClassName)`
    `void` | `addField(java.lang.String fieldName, java.lang.String type, short flags)` Add a field to the class.
    `void` | `addField(java.lang.String fieldName, java.lang.String type, short flags, double value)` Add a field to the class.
    `void` | `addField(java.lang.String fieldName, java.lang.String type, short flags, int value)` Add a field to the class.
    `void` | `addField(java.lang.String fieldName, java.lang.String type, short flags, long value)` Add a field to the class.
    `void` | `addFLoad(int local)` Load float from the given local into stack.
    `void` | `addFStore(int local)` Store float from stack top into the given local.
    `void` | `addILoad(int local)` Load integer from the given local into stack.
    `void` | `addInterface(java.lang.String interfaceName)` Add an interface implemented by this class.
    `void` | `addInvoke(int theOpCode, java.lang.String className, java.lang.String methodName, java.lang.String methodType)`
    `void` | `addIStore(int local)` Store integer from stack top into the given local.
    `void` | `addLineNumberEntry(short lineNumber)`
    `void` | `addLLoad(int local)` Load long from the given local into stack.
    `void` | `addLoadConstant(double k)` Generate the load constant bytecode for the given double.
    `void` | `addLoadConstant(float k)` Generate the load constant bytecode for the given float.
    `void` | `addLoadConstant(int k)` Generate the load constant bytecode for the given integer.
    `void` | `addLoadConstant(long k)` Generate the load constant bytecode for the given long.
    `void` | `addLoadConstant(java.lang.String k)` Generate the load constant bytecode for the given string.
    `void` | `addLoadThis()` Load "this" into stack.
    `void` | `addLStore(int local)` Store long from stack top into the given local.
    `void` | `addPush(boolean k)`
    `void` | `addPush(double k)` Generate code to load the given double on stack.
    `void` | `addPush(int k)` Generate code to load the given integer on stack.
    `void` | `addPush(long k)` Generate code to load the given long on stack.
    `void` | `addPush(java.lang.String k)` Generate the code to leave on stack the given string even if the string encoding exeeds the class file limit for single string constant
    `int` | `addTableSwitch(int low, int high)`
    `void` | `addVariableDescriptor(java.lang.String name, java.lang.String type, int startPC, int register)` Add Information about java variable to use when generating the local variable table.
    `void` | `adjustStackTop(int delta)`
    `static java.lang.String` | `classNameToSignature(java.lang.String name)` Convert Java class name in dot notation into "Lname-with-dots-replaced-by-slashes;" form suitable for use as JVM type signatures.
    `java.lang.String` | `getClassName()`
    `int` | `getCurrentCodeOffset()` Get the current offset into the code of the current method.
    `int` | `getLabelPC(int label)`
    `short` | `getStackTop()`
    `boolean` | `isUnderStringSizeLimit(java.lang.String k)` Check if k fits limit on string constant size imposed by class file format.
    `void` | `markHandler(int theLabel)`
    `void` | `markLabel(int label)`
    `void` | `markLabel(int label, short stackTop)`
    `void` | `markTableSwitchCase(int switchStart, int caseIndex)`
    `void` | `markTableSwitchCase(int switchStart, int caseIndex, int stackTop)`
    `void` | `markTableSwitchDefault(int switchStart)`
    `void` | `setFlags(short flags)` Set the class's flags.
    `void` | `setStackTop(short n)`
    `void` | `setTableSwitchJump(int switchStart, int caseIndex, int jumpTarget)` Set a jump case for a tableswitch instruction.
    `void` | `startMethod(java.lang.String methodName, java.lang.String type, short flags)` Add a method and begin adding code.
    `void` | `stopMethod(short maxLocals)` Complete generation of the method.
    `byte[]` | `toByteArray()` Get the class file as array of bytesto the OutputStream.
    `void` | `write(java.io.OutputStream oStream)` Write the class file to the OutputStream.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### ACC_PUBLIC

          public static final short ACC_PUBLIC

      See Also:
        Constant Field Values

    - #### ACC_PRIVATE

          public static final short ACC_PRIVATE

      See Also:
        Constant Field Values

    - #### ACC_PROTECTED

          public static final short ACC_PROTECTED

      See Also:
        Constant Field Values

    - #### ACC_STATIC

          public static final short ACC_STATIC

      See Also:
        Constant Field Values

    - #### ACC_FINAL

          public static final short ACC_FINAL

      See Also:
        Constant Field Values

    - #### ACC_SUPER

          public static final short ACC_SUPER

      See Also:
        Constant Field Values

    - #### ACC_SYNCHRONIZED

          public static final short ACC_SYNCHRONIZED

      See Also:
        Constant Field Values

    - #### ACC_VOLATILE

          public static final short ACC_VOLATILE

      See Also:
        Constant Field Values

    - #### ACC_TRANSIENT

          public static final short ACC_TRANSIENT

      See Also:
        Constant Field Values

    - #### ACC_NATIVE

          public static final short ACC_NATIVE

      See Also:
        Constant Field Values

    - #### ACC_ABSTRACT

          public static final short ACC_ABSTRACT

      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### ClassFileWriter

          public ClassFileWriter(java.lang.String className,
                                 java.lang.String superClassName,
                                 java.lang.String sourceFileName)

      Construct a ClassFileWriter for a class.
      Parameters:
        `className` - the name of the class to write, including full package qualification.
        `superClassName` - the name of the superclass of the class to write, including full package qualification.
        `sourceFileName` - the name of the source file to use for producing debug information, or null if debug information is not desired

  - ### Method Detail

    - #### getClassName

          public final java.lang.String getClassName()

    - #### addInterface

          public void addInterface(java.lang.String interfaceName)

      Add an interface implemented by this class. This method may be called multiple times for classes that implement multiple interfaces.
      Parameters:
        `interfaceName` - a name of an interface implemented by the class being written, including full package qualification.

    - #### setFlags

          public void setFlags(short flags)

      Set the class's flags. Flags must be a set of the following flags, bitwise or'd together: ACC_PUBLIC ACC_PRIVATE ACC_PROTECTED ACC_FINAL ACC_ABSTRACT TODO: check that this is the appropriate set
      Parameters:
        `flags` - the set of class flags to set

    - #### classNameToSignature

          public static java.lang.String classNameToSignature(java.lang.String name)

      Convert Java class name in dot notation into "Lname-with-dots-replaced-by-slashes;" form suitable for use as JVM type signatures.

    - #### addField

          public void addField(java.lang.String fieldName,
                               java.lang.String type,
                               short flags)

      Add a field to the class.
      Parameters:
        `fieldName` - the name of the field
        `type` - the type of the field using ...
        `flags` - the attributes of the field, such as ACC_PUBLIC, etc. bitwise or'd together

    - #### addField

          public void addField(java.lang.String fieldName,
                               java.lang.String type,
                               short flags,
                               int value)

      Add a field to the class.
      Parameters:
        `fieldName` - the name of the field
        `type` - the type of the field using ...
        `flags` - the attributes of the field, such as ACC_PUBLIC, etc. bitwise or'd together
        `value` - an initial integral value

    - #### addField

          public void addField(java.lang.String fieldName,
                               java.lang.String type,
                               short flags,
                               long value)

      Add a field to the class.
      Parameters:
        `fieldName` - the name of the field
        `type` - the type of the field using ...
        `flags` - the attributes of the field, such as ACC_PUBLIC, etc. bitwise or'd together
        `value` - an initial long value

    - #### addField

          public void addField(java.lang.String fieldName,
                               java.lang.String type,
                               short flags,
                               double value)

      Add a field to the class.
      Parameters:
        `fieldName` - the name of the field
        `type` - the type of the field using ...
        `flags` - the attributes of the field, such as ACC_PUBLIC, etc. bitwise or'd together
        `value` - an initial double value

    - #### addVariableDescriptor

          public void addVariableDescriptor(java.lang.String name,
                                            java.lang.String type,
                                            int startPC,
                                            int register)

      Add Information about java variable to use when generating the local variable table.
      Parameters:
        `name` - variable name.
        `type` - variable type as bytecode descriptor string.
        `startPC` - the starting bytecode PC where this variable is live, or -1 if it does not have a Java register.
        `register` - the Java register number of variable or -1 if it does not have a Java register.

    - #### startMethod

          public void startMethod(java.lang.String methodName,
                                  java.lang.String type,
                                  short flags)

      Add a method and begin adding code. This method must be called before other methods for adding code, exception tables, etc. can be invoked.
      Parameters:
        `methodName` - the name of the method
        `type` - a string representing the type
        `flags` - the attributes of the field, such as ACC_PUBLIC, etc. bitwise or'd together

    - #### stopMethod

          public void stopMethod(short maxLocals)

      Complete generation of the method. After this method is called, no more code can be added to the method begun with `startMethod`.
      Parameters:
        `maxLocals` - the maximum number of local variable slots (a.k.a. Java registers) used by the method

    - #### add

          public void add(int theOpCode)

      Add the single-byte opcode to the current method.
      Parameters:
        `theOpCode` - the opcode of the bytecode

    - #### add

          public void add(int theOpCode,
                          int theOperand)

      Add a single-operand opcode to the current method.
      Parameters:
        `theOpCode` - the opcode of the bytecode
        `theOperand` - the operand of the bytecode

    - #### addLoadConstant

          public void addLoadConstant(int k)

      Generate the load constant bytecode for the given integer.
      Parameters:
        `k` - the constant

    - #### addLoadConstant

          public void addLoadConstant(long k)

      Generate the load constant bytecode for the given long.
      Parameters:
        `k` - the constant

    - #### addLoadConstant

          public void addLoadConstant(float k)

      Generate the load constant bytecode for the given float.
      Parameters:
        `k` - the constant

    - #### addLoadConstant

          public void addLoadConstant(double k)

      Generate the load constant bytecode for the given double.
      Parameters:
        `k` - the constant

    - #### addLoadConstant

          public void addLoadConstant(java.lang.String k)

      Generate the load constant bytecode for the given string.
      Parameters:
        `k` - the constant

    - #### add

          public void add(int theOpCode,
                          int theOperand1,
                          int theOperand2)

      Add the given two-operand bytecode to the current method.
      Parameters:
        `theOpCode` - the opcode of the bytecode
        `theOperand1` - the first operand of the bytecode
        `theOperand2` - the second operand of the bytecode

    - #### add

          public void add(int theOpCode,
                          java.lang.String className)

    - #### add

          public void add(int theOpCode,
                          java.lang.String className,
                          java.lang.String fieldName,
                          java.lang.String fieldType)

    - #### addInvoke

          public void addInvoke(int theOpCode,
                                java.lang.String className,
                                java.lang.String methodName,
                                java.lang.String methodType)

    - #### addPush

          public void addPush(int k)

      Generate code to load the given integer on stack.
      Parameters:
        `k` - the constant

    - #### addPush

          public void addPush(boolean k)

    - #### addPush

          public void addPush(long k)

      Generate code to load the given long on stack.
      Parameters:
        `k` - the constant

    - #### addPush

          public void addPush(double k)

      Generate code to load the given double on stack.
      Parameters:
        `k` - the constant

    - #### addPush

          public void addPush(java.lang.String k)

      Generate the code to leave on stack the given string even if the string encoding exeeds the class file limit for single string constant
      Parameters:
        `k` - the constant

    - #### isUnderStringSizeLimit

          public boolean isUnderStringSizeLimit(java.lang.String k)

      Check if k fits limit on string constant size imposed by class file format.
      Parameters:
        `k` - the string constant

    - #### addIStore

          public void addIStore(int local)

      Store integer from stack top into the given local.
      Parameters:
        `local` - number of local register

    - #### addLStore

          public void addLStore(int local)

      Store long from stack top into the given local.
      Parameters:
        `local` - number of local register

    - #### addFStore

          public void addFStore(int local)

      Store float from stack top into the given local.
      Parameters:
        `local` - number of local register

    - #### addDStore

          public void addDStore(int local)

      Store double from stack top into the given local.
      Parameters:
        `local` - number of local register

    - #### addAStore

          public void addAStore(int local)

      Store object from stack top into the given local.
      Parameters:
        `local` - number of local register

    - #### addILoad

          public void addILoad(int local)

      Load integer from the given local into stack.
      Parameters:
        `local` - number of local register

    - #### addLLoad

          public void addLLoad(int local)

      Load long from the given local into stack.
      Parameters:
        `local` - number of local register

    - #### addFLoad

          public void addFLoad(int local)

      Load float from the given local into stack.
      Parameters:
        `local` - number of local register

    - #### addDLoad

          public void addDLoad(int local)

      Load double from the given local into stack.
      Parameters:
        `local` - number of local register

    - #### addALoad

          public void addALoad(int local)

      Load object from the given local into stack.
      Parameters:
        `local` - number of local register

    - #### addLoadThis

          public void addLoadThis()

      Load "this" into stack.

    - #### addTableSwitch

          public int addTableSwitch(int low,
                                    int high)

    - #### markTableSwitchDefault

          public final void markTableSwitchDefault(int switchStart)

    - #### markTableSwitchCase

          public final void markTableSwitchCase(int switchStart,
                                                int caseIndex)

    - #### markTableSwitchCase

          public final void markTableSwitchCase(int switchStart,
                                                int caseIndex,
                                                int stackTop)

    - #### setTableSwitchJump

          public void setTableSwitchJump(int switchStart,
                                         int caseIndex,
                                         int jumpTarget)

      Set a jump case for a tableswitch instruction. The jump target should be marked as a super block start for stack map generation.

    - #### acquireLabel

          public int acquireLabel()

    - #### markLabel

          public void markLabel(int label)

    - #### markLabel

          public void markLabel(int label,
                                short stackTop)

    - #### markHandler

          public void markHandler(int theLabel)

    - #### getLabelPC

          public int getLabelPC(int label)

    - #### getCurrentCodeOffset

          public int getCurrentCodeOffset()

      Get the current offset into the code of the current method.
      Returns:
        an integer representing the offset

    - #### getStackTop

          public short getStackTop()

    - #### setStackTop

          public void setStackTop(short n)

    - #### adjustStackTop

          public void adjustStackTop(int delta)

    - #### addExceptionHandler

          public void addExceptionHandler(int startLabel,
                                          int endLabel,
                                          int handlerLabel,
                                          java.lang.String catchClassName)

    - #### addLineNumberEntry

          public void addLineNumberEntry(short lineNumber)

    - #### write

          public void write(java.io.OutputStream oStream)
                     throws java.io.IOException

      Write the class file to the OutputStream.
      Parameters:
        `oStream` - the stream to write to
      Throws:
        `java.io.IOException` - if writing to the stream produces an exception

    - #### toByteArray

          public byte[] toByteArray()

      Get the class file as array of bytesto the OutputStream.