## 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
`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
`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
`ClassFileWriter(java.lang.String className, java.lang.String superClassName, java.lang.String sourceFileName)` Construct a ClassFileWriter for a class.

Method Summary
`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.
`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)

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