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.
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
    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

    Fields
    Modifier and Type
    Field
    Description
    static final short
     
    static final short
     
    static final short
     
    static final short
     
    static final short
     
    static final short
     
    static final short
     
    static final short
     
    static final short
     
    static final short
     
    static final short
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    ClassFileWriter(String className, String superClassName, String sourceFileName)
    Construct a ClassFileWriter for a class.
  • Method Summary

    Modifier and Type
    Method
    Description
    int
     
    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, String className)
     
    void
    add(int theOpCode, String className, String fieldName, 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, String catchClassName)
     
    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
    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(String interfaceName)
    Add an interface implemented by this class.
    void
    addInvoke(int theOpCode, String className, String methodName, 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
    Generate the load constant bytecode for the given integer.
    void
    Generate the load constant bytecode for the given long.
    void
    Generate the load constant bytecode for the given string.
    void
    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
    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(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
    Convert Java class name in dot notation into "Lname-with-dots-replaced-by-slashes;" form suitable for use as JVM type signatures.
    final String
     
    int
    Get the current offset into the code of the current method.
    int
    getLabelPC(int label)
     
    short
     
    boolean
    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)
     
    final void
    markTableSwitchCase(int switchStart, int caseIndex)
     
    final void
    markTableSwitchCase(int switchStart, int caseIndex, int stackTop)
     
    final 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(String methodName, String type, short flags)
    Add a method and begin adding code.
    void
    stopMethod(short maxLocals)
    Complete generation of the method.
    byte[]
    Get the class file as array of bytesto the OutputStream.
    void
    Write the class file to the OutputStream.

    Methods inherited from class java.lang.Object

    equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 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(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(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)
    • 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, 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, 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.