org.objectweb.asm
Class ClassWriter
public
class
ClassWriter
extends Object
implements ClassVisitor
A {@link ClassVisitor} that generates classes in bytecode form. More
precisely this visitor generates a byte array conforming to the Java class
file format. It can be used alone, to generate a Java class "from scratch",
or with one or more {@link ClassReader ClassReader} and adapter class visitor
to generate a modified class from one or more existing Java classes.
Author: Eric Bruneton
Field Summary |
static int | COMPUTE_FRAMES
Flag to automatically compute the stack map frames of methods from
scratch. |
static int | COMPUTE_MAXS
Flag to automatically compute the maximum stack size and the maximum
number of local variables of methods. |
Method Summary |
protected String | getCommonSuperClass(String type1, String type2)
Returns the common super type of the two given types. |
int | newClass(String value)
Adds a class reference to the constant pool of the class being build.
|
int | newConst(Object cst)
Adds a number or string constant to the constant pool of the class being
build. |
int | newField(String owner, String name, String desc)
Adds a field reference to the constant pool of the class being build.
|
int | newMethod(String owner, String name, String desc, boolean itf)
Adds a method reference to the constant pool of the class being build.
|
int | newNameType(String name, String desc)
Adds a name and type to the constant pool of the class being build. |
int | newUTF8(String value)
Adds an UTF8 string to the constant pool of the class being build. |
byte[] | toByteArray()
Returns the bytecode of the class that was build with this class writer.
|
void | visit(int version, int access, String name, String signature, String superName, String[] interfaces) |
AnnotationVisitor | visitAnnotation(String desc, boolean visible) |
void | visitAttribute(Attribute attr) |
void | visitEnd() |
FieldVisitor | visitField(int access, String name, String desc, String signature, Object value) |
void | visitInnerClass(String name, String outerName, String innerName, int access) |
MethodVisitor | visitMethod(int access, String name, String desc, String signature, String[] exceptions) |
void | visitOuterClass(String owner, String name, String desc) |
void | visitSource(String file, String debug) |
public static final int COMPUTE_FRAMES
Flag to automatically compute the stack map frames of methods from
scratch. If this flag is set, then the calls to the
{@link MethodVisitor#visitFrame} method are ignored, and the stack map
frames are recomputed from the methods bytecode. The arguments of the
{@link MethodVisitor#visitMaxs visitMaxs} method are also ignored and
recomputed from the bytecode. In other words, computeFrames implies
computeMaxs.
See Also: ClassWriter
public static final int COMPUTE_MAXS
Flag to automatically compute the maximum stack size and the maximum
number of local variables of methods. If this flag is set, then the
arguments of the {@link MethodVisitor#visitMaxs visitMaxs} method of the
{@link MethodVisitor} returned by the {@link #visitMethod visitMethod}
method will be ignored, and computed automatically from the signature and
the bytecode of each method.
See Also: ClassWriter
public ClassWriter(int flags)
Constructs a new {@link ClassWriter} object.
Parameters: flags option flags that can be used to modify the default behavior
of this class. See {@link #COMPUTE_MAXS}, {@link #COMPUTE_FRAMES}.
Constructs a new {@link ClassWriter} object and enables optimizations for
"mostly add" bytecode transformations. These optimizations are the
following:
- The constant pool from the original class is copied as is in
the new class, which saves time. New constant pool entries will be added
at the end if necessary, but unused constant pool entries won't be
removed.
- Methods that are not transformed are copied as
is in the new class, directly from the original class bytecode (i.e.
without emitting visit events for all the method instructions), which
saves a lot of time. Untransformed methods are detected by the
fact that the {@link ClassReader} receives {@link MethodVisitor} objects
that come from a {@link ClassWriter} (and not from a custom
{@link ClassAdapter} or any other {@link ClassVisitor} instance).
Parameters: classReader the {@link ClassReader} used to read the original
class. It will be used to copy the entire constant pool from the
original class and also to copy other fragments of original
bytecode where applicable. flags option flags that can be used to modify the default behavior
of this class. See {@link #COMPUTE_MAXS}, {@link #COMPUTE_FRAMES}.
protected String getCommonSuperClass(String type1, String type2)
Returns the common super type of the two given types. The default
implementation of this method
loads the two given classes and uses
the java.lang.Class methods to find the common super class. It can be
overridden to compute this common super type in other ways, in particular
without actually loading any class, or to take into account the class
that is currently being generated by this ClassWriter, which can of
course not be loaded since it is under construction.
Parameters: type1 the internal name of a class. type2 the internal name of another class.
Returns: the internal name of the common super class of the two given
classes.
public int newClass(String value)
Adds a class reference to the constant pool of the class being build.
Does nothing if the constant pool already contains a similar item.
This method is intended for {@link Attribute} sub classes, and is
normally not needed by class generators or adapters.
Parameters: value the internal name of the class.
Returns: the index of a new or already existing class reference item.
public int newConst(Object cst)
Adds a number or string constant to the constant pool of the class being
build. Does nothing if the constant pool already contains a similar item.
This method is intended for {@link Attribute} sub classes, and is
normally not needed by class generators or adapters.
Parameters: cst the value of the constant to be added to the constant pool.
This parameter must be an {@link Integer}, a {@link Float}, a
{@link Long}, a {@link Double} or a {@link String}.
Returns: the index of a new or already existing constant item with the
given value.
public int newField(String owner, String name, String desc)
Adds a field reference to the constant pool of the class being build.
Does nothing if the constant pool already contains a similar item.
This method is intended for {@link Attribute} sub classes, and is
normally not needed by class generators or adapters.
Parameters: owner the internal name of the field's owner class. name the field's name. desc the field's descriptor.
Returns: the index of a new or already existing field reference item.
public int newMethod(String owner, String name, String desc, boolean itf)
Adds a method reference to the constant pool of the class being build.
Does nothing if the constant pool already contains a similar item.
This method is intended for {@link Attribute} sub classes, and is
normally not needed by class generators or adapters.
Parameters: owner the internal name of the method's owner class. name the method's name. desc the method's descriptor. itf true if owner is an interface.
Returns: the index of a new or already existing method reference item.
public int newNameType(String name, String desc)
Adds a name and type to the constant pool of the class being build. Does
nothing if the constant pool already contains a similar item.
This
method is intended for {@link Attribute} sub classes, and is normally not
needed by class generators or adapters.
Parameters: name a name. desc a type descriptor.
Returns: the index of a new or already existing name and type item.
public int newUTF8(String value)
Adds an UTF8 string to the constant pool of the class being build. Does
nothing if the constant pool already contains a similar item.
This
method is intended for {@link Attribute} sub classes, and is normally not
needed by class generators or adapters.
Parameters: value the String value.
Returns: the index of a new or already existing UTF8 item.
public byte[] toByteArray()
Returns the bytecode of the class that was build with this class writer.
Returns: the bytecode of the class that was build with this class writer.
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
public void visitEnd()
public
FieldVisitor visitField(int access, String name, String desc, String signature, Object value)
public void visitInnerClass(String name, String outerName, String innerName, int access)
public
MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
public void visitOuterClass(String owner, String name, String desc)
public void visitSource(String file, String debug)