Class ClassFileWriter

java.lang.Object
org.mozilla.classfile.ClassFileWriter

public class ClassFileWriter extends 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 Details

  • 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

    • getClassName

      public final String getClassName()
    • 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.
    • 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 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.
    • 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, 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
    • 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
    • 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.
    • 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(int 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(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, String className)
    • add

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

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

      public void addInvokeDynamic(String methodName, String methodType, ClassFileWriter.MHandle bsm, Object... bsmArgs)
    • 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(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(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, int 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 int getStackTop()
    • setStackTop

      public void setStackTop(short n)
    • adjustStackTop

      public void adjustStackTop(int delta)
    • addExceptionHandler

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

      public void addLineNumberEntry(short lineNumber)
    • write

      public void write(OutputStream oStream) throws IOException
      Write the class file to the OutputStream.
      Parameters:
      oStream - the stream to write to
      Throws:
      IOException - if writing to the stream produces an exception
    • toByteArray

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