Top Description Fields Constructors Methods
org.objectweb.asm.util

public abstract Class Printer

extends Object
Class Inheritance
Known Direct Subclasses
org.objectweb.asm.util.Textifier, org.objectweb.asm.util.ASMifier
Imports
java.io.FileInputStream, .IOException, .InputStream, .PrintWriter, java.util.ArrayList, .List, org.objectweb.asm.Attribute, .ClassReader, .ConstantDynamic, .Handle, .Label, .Opcodes, .Type, .TypePath, .TypeReference

An abstract converter from visit events to text.
Author
Eric Bruneton

Field Summary

Modifier and TypeField and Description
protected final int
api

The ASM API version implemented by this class.

public static final String[]
HANDLE_TAG

The names of the tag field values for org.objectweb.asm.Handle.

public static final String[]
OPCODES

The names of the Java Virtual Machine opcodes.

protected final StringBuilder
stringBuilder

The builder used to build strings in the various visit methods.

public final List<Object>
text

The text to be printed.

public static final String[]
TYPES

The names of the operand values of the org.objectweb.asm.MethodVisitor#visitIntInsn method when opcode is NEWARRAY.

private static final String
UNSUPPORTED_OPERATION

Message of the UnsupportedOperationException thrown by methods which must be overridden.

Constructor Summary

AccessConstructor and Description
protected
Printer(final int
the ASM API version implemented by this printer. Must be one of the ASMx values in Opcodes.
api
)

Constructs a new Printer.

Method Summary

Modifier and TypeMethod and Description
public static void
appendString(final StringBuilder
the buffer where the string must be added.
stringBuilder
,
final String
the string to be added.
string
)

Appends a quoted string to the given string builder.

public List<Object>

Returns:

the text constructed by this visitor. See text.
getText
()

Returns the text constructed by this visitor.

pack-priv static void
main(final String[]
the command line arguments.
args
,
final String
the help message to show when command line arguments are incorrect.
usage
,
final Printer
the printer to convert the class into text.
printer
,
final PrintWriter
where to print the result.
output
,
final PrintWriter
where to log errors.
logger
)

Prints the given class to the given output.

pack-priv static void
printList(final PrintWriter
the writer to be used to print the tree.
printWriter
,
final List<?>
a string tree, i.e., a string list that can contain other string lists, and so on recursively.
list
)

Prints the given string tree.

public abstract void
visit(int
the class version. The minor version is stored in the 16 most significant bits, and the major version in the 16 least significant bits.
version
,
int
the class's access flags (see Opcodes). This parameter also indicates if the class is deprecated.
access
,
String
the internal name of the class (see Type#getInternalName()).
name
,
String
the signature of this class. May be null if the class is not a generic one, and does not extend or implement generic classes or interfaces.
signature
,
String
the internal of name of the super class (see Type#getInternalName()). For interfaces, the super class is Object. May be null, but only for the Object class.
superName
,
String[]
the internal names of the class's interfaces (see Type#getInternalName()). May be null.
interfaces
)

Class header.

public abstract void
visit(String
the value name.
name
,
Object
the actual value, whose type must be Byte, Boolean, Character, Short, Integer , Long, Float, Double, String or Type of Type#OBJECT or Type#ARRAY sort. This value can also be an array of byte, boolean, short, char, int, long, float or double values (this is equivalent to using visitArray and visiting each array element in turn, but is more convenient).
value
)

Annotation value.

public Printer

Returns:

the printer.
visitAnnotableParameterCount
(final int
the number of method parameters than can have annotations. This number must be less or equal than the number of parameter types in the method descriptor. It can be strictly less when a method has synthetic parameters and when these parameters are ignored when computing parameter indices for the purpose of parameter annotations (see https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.18).
parameterCount
,
final boolean
true to define the number of method parameters that can have annotations visible at runtime, false to define the number of method parameters that can have annotations invisible at runtime.
visible
)

Number of method parameters that can have annotations.

public abstract Printer

Returns:

the printer.
visitAnnotation
(String
the value name.
name
,
String
the class descriptor of the nested annotation class.
descriptor
)

Nested annotation value.

public abstract Printer

Returns:

the printer.
visitAnnotationDefault
()

Method default annotation.

public abstract void
visitAnnotationEnd()

Annotation end.

public abstract Printer

Returns:

the printer.
visitArray
(String
the value name.
name
)

Annotation array value.

public abstract Printer

Returns:

the printer.
visitClassAnnotation
(String
the class descriptor of the annotation class.
descriptor
,
boolean
true if the annotation is visible at runtime.
visible
)

Class annotation.

public abstract void
visitClassAttribute(Attribute
an attribute.
attribute
)

Class attribute.

public abstract void
visitClassEnd()

Class end.

public Printer

Returns:

the printer.
visitClassTypeAnnotation
(final int
a reference to the annotated type. The sort of this type reference must be TypeReference#CLASS_TYPE_PARAMETER, TypeReference#CLASS_TYPE_PARAMETER_BOUND or TypeReference#CLASS_EXTENDS. See TypeReference.
typeRef
,
final TypePath
the path to the annotated type argument, wildcard bound, array element type, or static inner type within 'typeRef'. May be null if the annotation targets 'typeRef' as a whole.
typePath
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Class type annotation.

public abstract void
visitCode()

Method start.

public abstract void
visitEnum(String
the value name.
name
,
String
the class descriptor of the enumeration class.
descriptor
,
String
the actual enumeration value.
value
)

Annotation enum value.

public void
visitExport(final String
the internal name of the exported package (see Type#getInternalName()).
packaze
,
final int
the access flag of the exported package, valid values are among ACC_SYNTHETIC and ACC_MANDATED.
access
,
final String...
the fully qualified names (using dots) of the modules that can access the public classes of the exported package, or null.
modules
)

Module export.

public abstract Printer

Returns:

the printer.
visitField
(int
the field's access flags (see Opcodes). This parameter also indicates if the field is synthetic and/or deprecated.
access
,
String
the field's name.
name
,
String
the field's descriptor (see Type).
descriptor
,
String
the field's signature. May be null if the field's type does not use generic types.
signature
,
Object
the field's initial value. This parameter, which may be null if the field does not have an initial value, must be an Integer, a Float, a Long, a Double or a String (for int, float, long or String fields respectively). This parameter is only used for static fields. Its value is ignored for non static fields, which must be initialized through bytecode instructions in constructors or methods.
value
)

Class field.

public abstract Printer

Returns:

the printer.
visitFieldAnnotation
(String
the class descriptor of the annotation class.
descriptor
,
boolean
true if the annotation is visible at runtime.
visible
)

Field annotation.

public abstract void
visitFieldAttribute(Attribute
an attribute.
attribute
)

Field attribute.

public abstract void
visitFieldEnd()

Field end.

public abstract void
visitFieldInsn(int
the opcode of the type instruction to be visited. This opcode is either GETSTATIC, PUTSTATIC, GETFIELD or PUTFIELD.
opcode
,
String
the internal name of the field's owner class (see Type#getInternalName()).
owner
,
String
the field's name.
name
,
String
the field's descriptor (see Type).
descriptor
)

Method instruction.

public Printer

Returns:

the printer.
visitFieldTypeAnnotation
(final int
a reference to the annotated type. The sort of this type reference must be TypeReference#FIELD. See TypeReference.
typeRef
,
final TypePath
the path to the annotated type argument, wildcard bound, array element type, or static inner type within 'typeRef'. May be null if the annotation targets 'typeRef' as a whole.
typePath
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Field type annotation.

public abstract void
visitFrame(int
the type of this stack map frame. Must be Opcodes#F_NEW for expanded frames, or Opcodes#F_FULL, Opcodes#F_APPEND, Opcodes#F_CHOP, Opcodes#F_SAME or Opcodes#F_APPEND, Opcodes#F_SAME1 for compressed frames.
type
,
int
the number of local variables in the visited frame.
numLocal
,
Object[]
the local variable types in this frame. This array must not be modified. Primitive types are represented by Opcodes#TOP, Opcodes#INTEGER, Opcodes#FLOAT, Opcodes#LONG, Opcodes#DOUBLE, Opcodes#NULL or Opcodes#UNINITIALIZED_THIS (long and double are represented by a single element). Reference types are represented by String objects (representing internal names, see Type#getInternalName()), and uninitialized types by Label objects (this label designates the NEW instruction that created this uninitialized value).
local
,
int
the number of operand stack elements in the visited frame.
numStack
,
Object[]
the operand stack types in this frame. This array must not be modified. Its content has the same format as the "local" array.
stack
)

Method stack frame.

public abstract void
visitIincInsn(int
index of the local variable to be incremented.
varIndex
,
int
amount to increment the local variable by.
increment
)

Method instruction.

public abstract void
visitInnerClass(String
the internal name of an inner class (see Type#getInternalName()).
name
,
String
the internal name of the class to which the inner class belongs (see Type#getInternalName()). May be null for not member classes.
outerName
,
String
the (simple) name of the inner class inside its enclosing class. May be null for anonymous inner classes.
innerName
,
int
the access flags of the inner class as originally declared in the enclosing class.
access
)

Class inner name.

public abstract void
visitInsn(int
the opcode of the instruction to be visited. This opcode is either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1, FCONST_0, FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD, FALOAD, DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, DASTORE, AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP, IADD, LADD, FADD, DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, MONITORENTER, or MONITOREXIT.
opcode
)

Method instruction.

public Printer

Returns:

the printer.
visitInsnAnnotation
(final int typeRef, final TypePath
the path to the annotated type argument, wildcard bound, array element type, or static inner type within 'typeRef'. May be null if the annotation targets 'typeRef' as a whole.
typePath
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Instruction type annotation.

public abstract void
visitIntInsn(int
the opcode of the instruction to be visited. This opcode is either BIPUSH, SIPUSH or NEWARRAY.
opcode
,
int
the operand of the instruction to be visited.
When opcode is BIPUSH, operand value should be between Byte.MIN_VALUE and Byte.MAX_VALUE.
When opcode is SIPUSH, operand value should be between Short.MIN_VALUE and Short.MAX_VALUE.
When opcode is NEWARRAY, operand value should be one of Opcodes#T_BOOLEAN, Opcodes#T_CHAR, Opcodes#T_FLOAT, Opcodes#T_DOUBLE, Opcodes#T_BYTE, Opcodes#T_SHORT, Opcodes#T_INT or Opcodes#T_LONG.
operand
)

Method instruction.

public abstract void
visitInvokeDynamicInsn(String
the method's name.
name
,
String
the method's descriptor (see Type).
descriptor
,
Handle
the bootstrap method.
bootstrapMethodHandle
,
Object...
the bootstrap method constant arguments. Each argument must be an Integer, Float, Long, Double, String, Type or Handle value. This method is allowed to modify the content of the array so a caller should expect that this array may change.
bootstrapMethodArguments
)

Method instruction.

public abstract void
visitJumpInsn(int
the opcode of the type instruction to be visited. This opcode is either IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE, GOTO, JSR, IFNULL or IFNONNULL.
opcode
,
Label
the operand of the instruction to be visited. This operand is a label that designates the instruction to which the jump instruction may jump.
label
)

Method jump instruction.

public abstract void
visitLabel(Label
a Label object.
label
)

Method label.

public abstract void
visitLdcInsn(Object
the constant to be loaded on the stack. This parameter must be a non null Integer, a Float, a Long, a Double, a String, a Type of OBJECT or ARRAY sort for .class constants, for classes whose version is 49, a Type of METHOD sort for MethodType, a Handle for MethodHandle constants, for classes whose version is 51 or a ConstantDynamic for a constant dynamic for classes whose version is 55.
value
)

Method instruction.

public abstract void
visitLineNumber(int
a line number. This number refers to the source file from which the class was compiled.
line
,
Label
the first instruction corresponding to this line number.
start
)

Method debug info.

public abstract void
visitLocalVariable(String
the name of a local variable.
name
,
String
the type descriptor of this local variable.
descriptor
,
String
the type signature of this local variable. May be null if the local variable type does not use generic types.
signature
,
Label
the first instruction corresponding to the scope of this local variable (inclusive).
start
,
Label
the last instruction corresponding to the scope of this local variable (exclusive).
end
,
int
the local variable's index.
index
)

Method debug info.

public Printer

Returns:

the printer.
visitLocalVariableAnnotation
(final int
a reference to the annotated type. The sort of this type reference must be TypeReference#LOCAL_VARIABLE or TypeReference#RESOURCE_VARIABLE. See TypeReference.
typeRef
,
final TypePath
the path to the annotated type argument, wildcard bound, array element type, or static inner type within 'typeRef'. May be null if the annotation targets 'typeRef' as a whole.
typePath
,
final Label[]
the fist instructions corresponding to the continuous ranges that make the scope of this local variable (inclusive).
start
,
final Label[]
the last instructions corresponding to the continuous ranges that make the scope of this local variable (exclusive). This array must have the same size as the 'start' array.
end
,
final int[]
the local variable's index in each range. This array must have the same size as the 'start' array.
index
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Local variable type annotation.

public abstract void
visitLookupSwitchInsn(Label
beginning of the default handler block.
dflt
,
int[]
the values of the keys.
keys
,
Label[]
beginnings of the handler blocks. labels[i] is the beginning of the handler block for the keys[i] key.
labels
)

Method instruction.

public void
visitMainClass(final String
the internal name of the main class of the current module (see Type#getInternalName()).
mainClass
)

Module main class.

public abstract void
visitMaxs(int
maximum stack size of the method.
maxStack
,
int
maximum number of local variables for the method.
maxLocals
)

Method max stack and max locals.

public abstract Printer

Returns:

the printer.
visitMethod
(int
the method's access flags (see Opcodes). This parameter also indicates if the method is synthetic and/or deprecated.
access
,
String
the method's name.
name
,
String
the method's descriptor (see Type).
descriptor
,
String
the method's signature. May be null if the method parameters, return type and exceptions do not use generic types.
signature
,
String[]
the internal names of the method's exception classes (see Type#getInternalName()). May be null.
exceptions
)

Class method.

public abstract Printer

Returns:

the printer.
visitMethodAnnotation
(String
the class descriptor of the annotation class.
descriptor
,
boolean
true if the annotation is visible at runtime.
visible
)

Method annotation.

public abstract void
visitMethodAttribute(Attribute
an attribute.
attribute
)

Method attribute.

public abstract void
visitMethodEnd()

Method end.

public void
visitMethodInsn(final int
the opcode of the type instruction to be visited. This opcode is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
opcode
,
final String
the internal name of the method's owner class (see Type#getInternalName()).
owner
,
final String
the method's name.
name
,
final String
the method's descriptor (see Type).
descriptor
)

Method instruction.
public void
visitMethodInsn(final int
the opcode of the type instruction to be visited. This opcode is either INVOKEVIRTUAL, INVOKESPECIAL, INVOKESTATIC or INVOKEINTERFACE.
opcode
,
final String
the internal name of the method's owner class (see Type#getInternalName()).
owner
,
final String
the method's name.
name
,
final String
the method's descriptor (see Type).
descriptor
,
final boolean
if the method's owner class is an interface.
isInterface
)

Method instruction.

public Printer

Returns:

the printer.
visitMethodTypeAnnotation
(final int typeRef, final TypePath
the path to the annotated type argument, wildcard bound, array element type, or static inner type within 'typeRef'. May be null if the annotation targets 'typeRef' as a whole.
typePath
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Method type annotation.

public Printer

Returns:

the printer.
visitModule
(final String
the fully qualified name (using dots) of the module.
name
,
final int
the module access flags, among ACC_OPEN, ACC_SYNTHETIC and ACC_MANDATED.
access
,
final String
the module version, or null.
version
)

Module.

public void
visitModuleEnd()

Module end.

public abstract void
visitMultiANewArrayInsn(String
an array type descriptor (see Type).
descriptor
,
int
the number of dimensions of the array to allocate.
numDimensions
)

Method instruction.

public void
visitNestHost(final String
the internal name of the host class of the nest (see Type#getInternalName()).
nestHost
)

Visits the nest host class of the class.

public void
visitNestMember(final String
the internal name of a nest member (see Type#getInternalName()).
nestMember
)

Visits a member of the nest.

public void
visitOpen(final String
the internal name of the opened package (see Type#getInternalName()).
packaze
,
final int
the access flag of the opened package, valid values are among ACC_SYNTHETIC and ACC_MANDATED.
access
,
final String...
the fully qualified names (using dots) of the modules that can use deep reflection to the classes of the open package, or null.
modules
)

Module open.

public abstract void
visitOuterClass(String
internal name of the enclosing class of the class (see Type#getInternalName()).
owner
,
String
the name of the method that contains the class, or null if the class is not enclosed in a method of its enclosing class.
name
,
String
the descriptor of the method that contains the class, or null if the class is not enclosed in a method of its enclosing class.
descriptor
)

Class outer class.

public void
visitPackage(final String
the internal name of a package (see Type#getInternalName()).
packaze
)

Module package.

public void
visitParameter(final String
parameter name or null if none is provided.
name
,
final int
the parameter's access flags, only ACC_FINAL, ACC_SYNTHETIC or/and ACC_MANDATED are allowed (see Opcodes).
access
)

Method parameter.

public abstract Printer

Returns:

the printer.
visitParameterAnnotation
(int
the parameter index. This index must be strictly smaller than the number of parameters in the method descriptor, and strictly smaller than the parameter count specified in visitAnnotableParameterCount.

Important Note

a parameter index i is not required to correspond to the i'th parameter descriptor in the method descriptor, in particular in case of synthetic parameters (see https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.7.18).

parameter
,
String
the class descriptor of the annotation class.
descriptor
,
boolean
true if the annotation is visible at runtime.
visible
)

Method parameter annotation.

public void
visitPermittedSubclass(final String
the internal name of a permitted subclass (see Type#getInternalName()).
permittedSubclass
)

Visits a permitted subclasses.

public void
visitProvide(final String
the internal name of the service (see Type#getInternalName()).
service
,
final String...
the internal names of the implementations of the service (there is at least one provider).
providers
)

Module provide.

public Printer

Returns:

a visitor to visit this record component annotations and attributes, or null if this class visitor is not interested in visiting these annotations and attributes.
visitRecordComponent
(final String
the field's name.
name
,
final String
the record component descriptor (see Type).
descriptor
,
final String
the record component signature. May be null if the record component type does not use generic types.
signature
)

Visits a record component of the class.

public Printer

Returns:

a visitor to visit the annotation values, or null if this visitor is not interested in visiting this annotation.
visitRecordComponentAnnotation
(final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Visits an annotation of the record component.

public void
visitRecordComponentAttribute(final Attribute
an attribute.
attribute
)

Visits a non standard attribute of the record component.

public void
visitRecordComponentEnd()

Visits the end of the record component.

public Printer

Returns:

a visitor to visit the annotation values, or null if this visitor is not interested in visiting this annotation.
visitRecordComponentTypeAnnotation
(final int
a reference to the annotated type. The sort of this type reference must be TypeReference#CLASS_TYPE_PARAMETER, TypeReference#CLASS_TYPE_PARAMETER_BOUND or TypeReference#CLASS_EXTENDS. See TypeReference.
typeRef
,
final TypePath
the path to the annotated type argument, wildcard bound, array element type, or static inner type within 'typeRef'. May be null if the annotation targets 'typeRef' as a whole.
typePath
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Visits an annotation on a type in the record component signature.

public void
visitRequire(final String
the fully qualified name (using dots) of the dependence.
module
,
final int
the access flag of the dependence among ACC_TRANSITIVE, ACC_STATIC_PHASE, ACC_SYNTHETIC and ACC_MANDATED.
access
,
final String
the module version at compile time, or null.
version
)

Module require.

public abstract void
visitSource(String
the name of the source file from which the class was compiled. May be null.
source
,
String
additional debug information to compute the correspondence between source and compiled elements of the class. May be null.
debug
)

Class source.

public abstract void
visitTableSwitchInsn(int
the minimum key value.
min
,
int
the maximum key value.
max
,
Label
beginning of the default handler block.
dflt
,
Label...
beginnings of the handler blocks. labels[i] is the beginning of the handler block for the min + i key.
labels
)

Method instruction.

public Printer

Returns:

the printer.
visitTryCatchAnnotation
(final int
a reference to the annotated type. The sort of this type reference must be TypeReference#EXCEPTION_PARAMETER. See TypeReference.
typeRef
,
final TypePath
the path to the annotated type argument, wildcard bound, array element type, or static inner type within 'typeRef'. May be null if the annotation targets 'typeRef' as a whole.
typePath
,
final String
the class descriptor of the annotation class.
descriptor
,
final boolean
true if the annotation is visible at runtime.
visible
)

Try catch block type annotation.

public abstract void
visitTryCatchBlock(Label
the beginning of the exception handler's scope (inclusive).
start
,
Label
the end of the exception handler's scope (exclusive).
end
,
Label
the beginning of the exception handler's code.
handler
,
String
the internal name of the type of exceptions handled by the handler (see Type#getInternalName()), or null to catch any exceptions (for "finally" blocks).
type
)

Method exception handler.

public abstract void
visitTypeInsn(int
the opcode of the type instruction to be visited. This opcode is either NEW, ANEWARRAY, CHECKCAST or INSTANCEOF.
opcode
,
String
the operand of the instruction to be visited. This operand must be the internal name of an object or array class (see Type#getInternalName()).
type
)

Method instruction.

public void
visitUse(final String
the internal name of the service (see Type#getInternalName()).
service
)

Module use.

public abstract void
visitVarInsn(int
the opcode of the local variable instruction to be visited. This opcode is either ILOAD, LLOAD, FLOAD, DLOAD, ALOAD, ISTORE, LSTORE, FSTORE, DSTORE, ASTORE or RET.
opcode
,
int
the operand of the instruction to be visited. This operand is the index of a local variable.
varIndex
)

Method instruction.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait