org.mozilla.classfile
Class ClassFileWriter

java.lang.Object
  extended by 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.
 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.