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.
acquireLabel
public int acquireLabel()
add
public void add(int theOpCode)
Add the single-byte opcode to the current method.
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.
theOpCode
- the opcode of the bytecodetheOperand
- 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.
theOpCode
- the opcode of the bytecodetheOperand1
- the first operand of the bytecodetheOperand2
- the second operand of the bytecode
addALoad
public void addALoad(int local)
Load object from the given local into stack.
local
- number of local register
addAStore
public void addAStore(int local)
Store object from stack top into the given local.
local
- number of local register
addDLoad
public void addDLoad(int local)
Load double from the given local into stack.
local
- number of local register
addDStore
public void addDStore(int local)
Store double from stack top into the given local.
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.
local
- number of local register
addFStore
public void addFStore(int local)
Store float from stack top into the given local.
local
- number of local register
addField
public void addField(String fieldName,
String type,
short flags)
Add a field to the class.
fieldName
- the name of the fieldtype
- 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.
fieldName
- the name of the fieldtype
- the type of the field using ...flags
- the attributes of the field, such as ACC_PUBLIC, etc.
bitwise or'd togethervalue
- an initial double value
addField
public void addField(String fieldName,
String type,
short flags,
int value)
Add a field to the class.
fieldName
- the name of the fieldtype
- the type of the field using ...flags
- the attributes of the field, such as ACC_PUBLIC, etc.
bitwise or'd togethervalue
- an initial integral value
addField
public void addField(String fieldName,
String type,
short flags,
long value)
Add a field to the class.
fieldName
- the name of the fieldtype
- the type of the field using ...flags
- the attributes of the field, such as ACC_PUBLIC, etc.
bitwise or'd togethervalue
- an initial long value
addILoad
public void addILoad(int local)
Load integer from the given local into stack.
local
- number of local register
addIStore
public void addIStore(int local)
Store integer from stack top into the given local.
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.
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.
local
- number of local register
addLStore
public void addLStore(int local)
Store long from stack top into the given local.
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.
addLoadConstant
public void addLoadConstant(double k)
Generate the load constant bytecode for the given double.
addLoadConstant
public void addLoadConstant(float k)
Generate the load constant bytecode for the given float.
addLoadConstant
public void addLoadConstant(int k)
Generate the load constant bytecode for the given integer.
addLoadConstant
public void addLoadConstant(long k)
Generate the load constant bytecode for the given long.
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
addPush
public void addPush(boolean k)
addPush
public void addPush(double k)
Generate code to load the given double on stack.
addPush
public void addPush(int k)
Generate code to load the given integer on stack.
addPush
public void addPush(long k)
Generate code to load the given long on stack.
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.
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.
- 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.
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
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.
methodName
- the name of the methodtype
- a string representing the typeflags
- 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
.
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.
oStream
- the stream to write to