com.ibm.wala.shrikeCT
Class ClassWriter

java.lang.Object
  extended by com.ibm.wala.shrikeCT.ClassWriter
All Implemented Interfaces:
ClassConstants

public final class ClassWriter
extends java.lang.Object
implements ClassConstants

This class formats and writes class data into JVM format.


Nested Class Summary
static class ClassWriter.Element
          An Element is an object that can be serialized into a byte buffer.
static class ClassWriter.RawElement
          A RawElement is an Element that is already available as some chunk of a byte buffer.
 
Field Summary
 
Fields inherited from interface com.ibm.wala.shrikeCT.ClassConstants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, CONSTANT_Class, CONSTANT_Double, CONSTANT_FieldRef, CONSTANT_Float, CONSTANT_Integer, CONSTANT_InterfaceMethodRef, CONSTANT_Long, CONSTANT_MethodRef, CONSTANT_NameAndType, CONSTANT_String, CONSTANT_Utf8, MAGIC
 
Constructor Summary
ClassWriter()
          Create a blank ClassWriter with no methods, fields, or attributes, an empty constant pool, no super class, no implemented interfaces, no name, majorVersion 46, and minorVersion 0.
 
Method Summary
 void addClassAttribute(ClassWriter.Element attribute)
          Add an atttribute to the class.
 int addCPClass(java.lang.String s)
          Add a Class to the constant pool if necessary.
 int addCPDouble(double d)
          Add a Double to the constant pool if necessary.
 int addCPFieldRef(java.lang.String c, java.lang.String n, java.lang.String t)
          Add a FieldRef to the constant pool if necessary.
 int addCPFloat(float f)
          Add a Float to the constant pool if necessary.
 int addCPInt(int i)
          Add an Integer to the constant pool if necessary.
 int addCPInterfaceMethodRef(java.lang.String c, java.lang.String n, java.lang.String t)
          Add an InterfaceMethodRef to the constant pool if necessary.
 int addCPLong(long l)
          Add a Long to the constant pool if necessary.
 int addCPMethodRef(java.lang.String c, java.lang.String n, java.lang.String t)
          Add a MethodRef to the constant pool if necessary.
 int addCPNAT(java.lang.String n, java.lang.String t)
          Add a NameAndType to the constant pool if necessary.
 int addCPString(java.lang.String s)
          Add a String to the constant pool if necessary.
 int addCPUtf8(java.lang.String s)
          Add a Utf8 string to the constant pool if necessary.
 void addField(int access, int name, int type, ClassWriter.Element[] attributes)
          Add a field to the class.
 void addField(int access, java.lang.String name, java.lang.String type, ClassWriter.Element[] attributes)
          Add a field to the class.
 void addMethod(int access, int name, int type, ClassWriter.Element[] attributes)
          Add a method to the class.
 void addMethod(int access, java.lang.String name, java.lang.String type, ClassWriter.Element[] attributes)
          Add a method to the class.
 void addRawField(ClassWriter.Element e)
          Add a field to the class, the field data given as "raw" bytes (probably obtained from a ClassReader).
 void addRawMethod(ClassWriter.Element e)
          Add a method to the class, the method data given as "raw" bytes (probably obtained from a ClassReader).
 byte[] makeBytes()
          After you've added everything you need to the class, call this method to generate the actual class file data.
 void setAccessFlags(int f)
          Set the access flags for the class.
static void setDouble(byte[] buf, int offset, double v)
          Set the 8 bytes at offset 'offset' in 'buf' to the double value in v.
static void setFloat(byte[] buf, int offset, float v)
          Set the 4 bytes at offset 'offset' in 'buf' to the float value in v.
 void setForceAddCPEntries(boolean force)
           
static void setInt(byte[] buf, int offset, int v)
          Set the 4 bytes at offset 'offset' in 'buf' to the signed 32-bit value in v.
 void setInterfaceNameIndices(int[] ifaces)
          Set the constant pool indices for the names of the implemented interfaces.
 void setInterfaceNames(java.lang.String[] ifaces)
          Set the names of the implemented interfaces.
static void setLong(byte[] buf, int offset, long v)
          Set the 8 bytes at offset 'offset' in 'buf' to the signed 64-bit value in v.
 void setMajorVersion(int major)
          Set the class file format major version.
 void setMinorVersion(int minor)
          Set the class file format minor version.
 void setName(java.lang.String c)
          Set the name of the class.
 void setNameIndex(int c)
          Set the constant pool index for the name of the class.
 void setRawCP(ConstantPoolParser cp, boolean cacheEntries)
          Copy a constant pool from some ClassReader into this class.
 void setSuperName(java.lang.String c)
          Set the name of the superclass; if c is null, then there is no superclass (this must be java/lang/Object).
 void setSuperNameIndex(int c)
          Set the constant pool index for the name of the superclass.
static void setUByte(byte[] buf, int offset, int v)
          Set the byte at offset 'offset' in 'buf' to the unsigned 8-bit value in v.
static void setUShort(byte[] buf, int offset, int v)
          Set the 2 bytes at offset 'offset' in 'buf' to the unsigned 16-bit value in v.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

ClassWriter

public ClassWriter()
Create a blank ClassWriter with no methods, fields, or attributes, an empty constant pool, no super class, no implemented interfaces, no name, majorVersion 46, and minorVersion 0.

Method Detail

setMajorVersion

public void setMajorVersion(int major)
Set the class file format major version. You probably don't want to use this unless you really know what you are doing.


setMinorVersion

public void setMinorVersion(int minor)
Set the class file format minor version. You probably don't want to use this unless you really know what you are doing.


setRawCP

public void setRawCP(ConstantPoolParser cp,
                     boolean cacheEntries)
              throws InvalidClassFileException,
                     java.lang.IllegalArgumentException
Copy a constant pool from some ClassReader into this class. This must be done before any entries are allocated in this ClassWriter's constant pool, and it can only be done once. If and only if this is done, it is safe to copy "raw" fields, methods and attributes from the ClassReader into this class, because the constant pool references in those fields, methods and attributes are guaranteed to point to the same constant pool items in this new class.

Parameters:
cacheEntries - records whether to parse the raw constant pool completely so that if new entries are required which are the same as entries already in the raw pool, the existing entries in the raw pool are used instead. Setting this to 'true' produces smaller constant pools but may slow down performance because the raw pool must be completely parsed
Throws:
InvalidClassFileException
java.lang.IllegalArgumentException

setForceAddCPEntries

public void setForceAddCPEntries(boolean force)
Parameters:
force - true iff you want the addCP methods to always create a new constant pool entry and never reuse an existing constant pool entry

addCPUtf8

public int addCPUtf8(java.lang.String s)
Add a Utf8 string to the constant pool if necessary.

Returns:
the index of a constant pool item with the right value

addCPInt

public int addCPInt(int i)
Add an Integer to the constant pool if necessary.

Returns:
the index of a constant pool item with the right value

addCPFloat

public int addCPFloat(float f)
Add a Float to the constant pool if necessary.

Returns:
the index of a constant pool item with the right value

addCPLong

public int addCPLong(long l)
Add a Long to the constant pool if necessary.

Returns:
the index of a constant pool item with the right value

addCPDouble

public int addCPDouble(double d)
Add a Double to the constant pool if necessary.

Returns:
the index of a constant pool item with the right value

addCPString

public int addCPString(java.lang.String s)
Add a String to the constant pool if necessary.

Returns:
the index of a constant pool item with the right value

addCPClass

public int addCPClass(java.lang.String s)
Add a Class to the constant pool if necessary.

Parameters:
s - the class name, in JVM format (e.g., java/lang/Object)
Returns:
the index of a constant pool item with the right value

addCPFieldRef

public int addCPFieldRef(java.lang.String c,
                         java.lang.String n,
                         java.lang.String t)
Add a FieldRef to the constant pool if necessary.

Parameters:
c - the class name, in JVM format (e.g., java/lang/Object)
n - the field name
t - the field type, in JVM format (e.g., I, Z, or Ljava/lang/Object;)
Returns:
the index of a constant pool item with the right value

addCPMethodRef

public int addCPMethodRef(java.lang.String c,
                          java.lang.String n,
                          java.lang.String t)
Add a MethodRef to the constant pool if necessary.

Parameters:
c - the class name, in JVM format (e.g., java/lang/Object)
n - the method name
t - the method type, in JVM format (e.g., V(ILjava/lang/Object;) )
Returns:
the index of a constant pool item with the right value

addCPInterfaceMethodRef

public int addCPInterfaceMethodRef(java.lang.String c,
                                   java.lang.String n,
                                   java.lang.String t)
Add an InterfaceMethodRef to the constant pool if necessary.

Parameters:
c - the class name, in JVM format (e.g., java/lang/Object)
n - the field name
t - the method type, in JVM format (e.g., V(ILjava/lang/Object;) )
Returns:
the index of a constant pool item with the right value

addCPNAT

public int addCPNAT(java.lang.String n,
                    java.lang.String t)
Add a NameAndType to the constant pool if necessary.

Parameters:
n - the name
t - the type, in JVM format
Returns:
the index of a constant pool item with the right value

setAccessFlags

public void setAccessFlags(int f)
Set the access flags for the class.


setNameIndex

public void setNameIndex(int c)
                  throws java.lang.IllegalArgumentException
Set the constant pool index for the name of the class.

Throws:
java.lang.IllegalArgumentException

setSuperNameIndex

public void setSuperNameIndex(int c)
Set the constant pool index for the name of the superclass.


setInterfaceNameIndices

public void setInterfaceNameIndices(int[] ifaces)
Set the constant pool indices for the names of the implemented interfaces.


setName

public void setName(java.lang.String c)
Set the name of the class.


setSuperName

public void setSuperName(java.lang.String c)
Set the name of the superclass; if c is null, then there is no superclass (this must be java/lang/Object).


setInterfaceNames

public void setInterfaceNames(java.lang.String[] ifaces)
Set the names of the implemented interfaces.


addRawMethod

public void addRawMethod(ClassWriter.Element e)
Add a method to the class, the method data given as "raw" bytes (probably obtained from a ClassReader).


addRawField

public void addRawField(ClassWriter.Element e)
Add a field to the class, the field data given as "raw" bytes (probably obtained from a ClassReader).


addMethod

public void addMethod(int access,
                      java.lang.String name,
                      java.lang.String type,
                      ClassWriter.Element[] attributes)
Add a method to the class.

Parameters:
access - the access flags
name - the method name
type - the method type in JVM format (e.g., V(ILjava/lang/Object;) )
attributes - the attributes in raw form, one Element per attribute

addField

public void addField(int access,
                     java.lang.String name,
                     java.lang.String type,
                     ClassWriter.Element[] attributes)
Add a field to the class.

Parameters:
access - the access flags
name - the field name
type - the field type in JVM format (e.g., I, Z, Ljava/lang/Object;)
attributes - the attributes in raw form, one Element per attribute

addMethod

public void addMethod(int access,
                      int name,
                      int type,
                      ClassWriter.Element[] attributes)
Add a method to the class.

Parameters:
access - the access flags
name - the constant pool index of the method name
type - the constant pool index of the method type in JVM format (e.g., V(ILjava/lang/Object;) )
attributes - the attributes in raw form, one Element per attribute

addField

public void addField(int access,
                     int name,
                     int type,
                     ClassWriter.Element[] attributes)
Add a field to the class.

Parameters:
access - the access flags
name - the constant pool index of the field name
type - the constant pool index of the field type in JVM format (e.g., I, Z, Ljava/lang/Object;)
attributes - the attributes in raw form, one Element per attribute

addClassAttribute

public void addClassAttribute(ClassWriter.Element attribute)
Add an atttribute to the class.

Parameters:
attribute - the attribute in raw form

makeBytes

public byte[] makeBytes()
                 throws java.lang.IllegalArgumentException
After you've added everything you need to the class, call this method to generate the actual class file data. This can only be called once.

Throws:
java.lang.IllegalArgumentException

setUByte

public static void setUByte(byte[] buf,
                            int offset,
                            int v)
                     throws java.lang.IllegalArgumentException
Set the byte at offset 'offset' in 'buf' to the unsigned 8-bit value in v.

Throws:
java.lang.IllegalArgumentException - if buf is null

setInt

public static void setInt(byte[] buf,
                          int offset,
                          int v)
                   throws java.lang.IllegalArgumentException
Set the 4 bytes at offset 'offset' in 'buf' to the signed 32-bit value in v.

Throws:
java.lang.IllegalArgumentException - if buf is null

setLong

public static void setLong(byte[] buf,
                           int offset,
                           long v)
                    throws java.lang.IllegalArgumentException
Set the 8 bytes at offset 'offset' in 'buf' to the signed 64-bit value in v.

Throws:
java.lang.IllegalArgumentException

setFloat

public static void setFloat(byte[] buf,
                            int offset,
                            float v)
                     throws java.lang.IllegalArgumentException
Set the 4 bytes at offset 'offset' in 'buf' to the float value in v.

Throws:
java.lang.IllegalArgumentException

setDouble

public static void setDouble(byte[] buf,
                             int offset,
                             double v)
                      throws java.lang.IllegalArgumentException
Set the 8 bytes at offset 'offset' in 'buf' to the double value in v.

Throws:
java.lang.IllegalArgumentException

setUShort

public static void setUShort(byte[] buf,
                             int offset,
                             int v)
                      throws java.lang.IllegalArgumentException
Set the 2 bytes at offset 'offset' in 'buf' to the unsigned 16-bit value in v.

Throws:
java.lang.IllegalArgumentException - if buf is null