org.mozilla.classfile

Class 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

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_SYNCHRONIZED
static short
ACC_TRANSIENT
static short
ACC_VOLATILE

Constructor Summary

ClassFileWriter(String className, String superClassName, 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, String className)
void
add(int theOpCode, String className, String fieldName, String fieldType)
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
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, String catchClassName)
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
addField(String fieldName, String type, short flags)
Add a field to the class.
void
addField(String fieldName, String type, short flags, double value)
Add a field to the class.
void
addField(String fieldName, String type, short flags, int value)
Add a field to the class.
void
addField(String fieldName, String type, short flags, long value)
Add a field to the class.
void
addILoad(int local)
Load integer from the given local into stack.
void
addIStore(int local)
Store integer from stack top into the given local.
void
addInterface(String interfaceName)
Add an interface implemented by this class.
void
addInvoke(int theOpCode, String className, String methodName, String methodType)
void
addLLoad(int local)
Load long from the given local into stack.
void
addLStore(int local)
Store long from stack top into the given local.
void
addLineNumberEntry(short lineNumber)
void
addLoadConstant(String k)
Generate the load constant bytecode for the given string.
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
addLoadThis()
Load "this" into stack.
void
addPush(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
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.
int
addTableSwitch(int low, int high)
void
addVariableDescriptor(String name, String type, int startPC, int register)
Add Information about java variable to use when generating the local variable table.
void
adjustStackTop(int delta)
static String
classNameToSignature(String name)
Convert Java class name in dot notation into "Lname-with-dots-replaced-by-slashes;" form suitable for use as JVM type signatures.
String
getClassName()
int
getCurrentCodeOffset()
Get the current offset into the code of the current method.
short
getStackTop()
boolean
isUnderStringSizeLimit(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
setTableSwitchJump(int switchStart, int caseIndex, int jumpTarget)
void
startMethod(String methodName, 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(OutputStream oStream)
Write the class file to the OutputStream.

Field Details

ACC_ABSTRACT

public static final short ACC_ABSTRACT
Field Value:
1024

ACC_FINAL

public static final short ACC_FINAL
Field Value:
16

ACC_NATIVE

public static final short ACC_NATIVE
Field Value:
256

ACC_PRIVATE

public static final short ACC_PRIVATE
Field Value:
2

ACC_PROTECTED

public static final short ACC_PROTECTED
Field Value:
4

ACC_PUBLIC

public static final short ACC_PUBLIC
Field Value:
1

ACC_STATIC

public static final short ACC_STATIC
Field Value:
8

ACC_SYNCHRONIZED

public static final short ACC_SYNCHRONIZED
Field Value:
32

ACC_TRANSIENT

public static final short ACC_TRANSIENT
Field Value:
128

ACC_VOLATILE

public static final short ACC_VOLATILE
Field Value:
64

Constructor Details

ClassFileWriter

public ClassFileWriter(String className,
                       String superClassName,
                       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 Details

acquireLabel

public int acquireLabel()

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,
                String className)

add

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

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

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

addALoad

public void addALoad(int local)
Load object from the given local into stack.
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

addDLoad

public void addDLoad(int local)
Load double from the given local into stack.
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

addExceptionHandler

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

addFLoad

public void addFLoad(int local)
Load float from the given local into stack.
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

addField

public void addField(String fieldName,
                     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(String fieldName,
                     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

addField

public void addField(String fieldName,
                     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(String fieldName,
                     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

addILoad

public void addILoad(int local)
Load integer from the given local into stack.
Parameters:
local - number of local register

addIStore

public void addIStore(int local)
Store integer from stack top into the given local.
Parameters:
local - number of local register

addInterface

public void addInterface(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.

addInvoke

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

addLLoad

public void addLLoad(int local)
Load long from the given local into stack.
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

addLineNumberEntry

public void addLineNumberEntry(short lineNumber)

addLoadConstant

public void addLoadConstant(String k)
Generate the load constant bytecode for the given string.
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(float k)
Generate the load constant bytecode for the given float.
Parameters:
k - the constant

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

addLoadThis

public void addLoadThis()
Load "this" into stack.

addPush

public void addPush(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

addPush

public void addPush(boolean k)

addPush

public void addPush(double k)
Generate code to load the given double on stack.
Parameters:
k - the constant

addPush

public void addPush(int k)
Generate code to load the given integer on stack.
Parameters:
k - the constant

addPush

public void addPush(long k)
Generate code to load the given long on stack.
Parameters:
k - the constant

addTableSwitch

public int addTableSwitch(int low,
                          int high)

addVariableDescriptor

public void addVariableDescriptor(String name,
                                  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.

adjustStackTop

public void adjustStackTop(int delta)

classNameToSignature

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

getClassName

public final String getClassName()

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()

isUnderStringSizeLimit

public boolean isUnderStringSizeLimit(String k)
Check if k fits limit on string constant size imposed by class file format.
Parameters:
k - the string constant

markHandler

public void markHandler(int theLabel)

markLabel

public void markLabel(int label)

markLabel

public void markLabel(int label,
                      short stackTop)

markTableSwitchCase

public final void markTableSwitchCase(int switchStart,
                                      int caseIndex)

markTableSwitchCase

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

markTableSwitchDefault

public final void markTableSwitchDefault(int switchStart)

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

setTableSwitchJump

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

startMethod

public void startMethod(String methodName,
                        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

toByteArray

public byte[] toByteArray()
Get the class file as array of bytesto the OutputStream.

write

public void write(OutputStream oStream)
            throws IOException
Write the class file to the OutputStream.
Parameters:
oStream - the stream to write to