Package 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 | 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 | 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 | 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 | 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.