public class StaticInitMerger extends ClassVisitor
ClassVisitor
that merges <clinit> methods into a single one. All the existing
<clinit> methods are renamed, and a new one is created, which calls all the renamed
methods.Modifier and Type | Field and Description |
---|---|
private MethodVisitor |
mergedClinitVisitor
The MethodVisitor for the merged <clinit> method.
|
private int |
numClinitMethods
The number of <clinit> methods visited so far.
|
private java.lang.String |
owner
The internal name of the visited class.
|
private java.lang.String |
renamedClinitMethodPrefix
The prefix to use to rename the existing <clinit> methods.
|
api, cv
Modifier | Constructor and Description |
---|---|
protected |
StaticInitMerger(int api,
java.lang.String prefix,
ClassVisitor classVisitor)
Constructs a new
StaticInitMerger . |
|
StaticInitMerger(java.lang.String prefix,
ClassVisitor classVisitor)
Constructs a new
StaticInitMerger . |
Modifier and Type | Method and Description |
---|---|
void |
visit(int version,
int access,
java.lang.String name,
java.lang.String signature,
java.lang.String superName,
java.lang.String[] interfaces)
Visits the header of the class.
|
void |
visitEnd()
Visits the end of the class.
|
MethodVisitor |
visitMethod(int access,
java.lang.String name,
java.lang.String descriptor,
java.lang.String signature,
java.lang.String[] exceptions)
Visits a method of the class.
|
visitAnnotation, visitAttribute, visitField, visitInnerClass, visitModule, visitNestHost, visitNestMember, visitOuterClass, visitPermittedSubtypeExperimental, visitRecordComponentExperimental, visitSource, visitTypeAnnotation
private java.lang.String owner
private final java.lang.String renamedClinitMethodPrefix
private int numClinitMethods
private MethodVisitor mergedClinitVisitor
public StaticInitMerger(java.lang.String prefix, ClassVisitor classVisitor)
StaticInitMerger
. Subclasses must not use this constructor.
Instead, they must use the StaticInitMerger(int, String, ClassVisitor)
version.prefix
- the prefix to use to rename the existing <clinit> methods.classVisitor
- the class visitor to which this visitor must delegate method calls. May be
null.protected StaticInitMerger(int api, java.lang.String prefix, ClassVisitor classVisitor)
StaticInitMerger
.api
- the ASM API version implemented by this visitor. Must be one of Opcodes.ASM4
, Opcodes.ASM5
or Opcodes.ASM6
.prefix
- the prefix to use to rename the existing <clinit> methods.classVisitor
- the class visitor to which this visitor must delegate method calls. May be
null.public void visit(int version, int access, java.lang.String name, java.lang.String signature, java.lang.String superName, java.lang.String[] interfaces)
ClassVisitor
visit
in class ClassVisitor
version
- the class version. The minor version is stored in the 16 most significant bits,
and the major version in the 16 least significant bits.access
- the class's access flags (see Opcodes
). This parameter also indicates if
the class is deprecated.name
- the internal name of the class (see Type.getInternalName()
).signature
- 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.superName
- 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.interfaces
- the internal names of the class's interfaces (see Type.getInternalName()
). May be null.public MethodVisitor visitMethod(int access, java.lang.String name, java.lang.String descriptor, java.lang.String signature, java.lang.String[] exceptions)
ClassVisitor
MethodVisitor
instance (or null) each time it is called, i.e., it should not return a previously
returned visitor.visitMethod
in class ClassVisitor
access
- the method's access flags (see Opcodes
). This parameter also indicates if
the method is synthetic and/or deprecated.name
- the method's name.descriptor
- the method's descriptor (see Type
).signature
- the method's signature. May be null if the method parameters,
return type and exceptions do not use generic types.exceptions
- the internal names of the method's exception classes (see Type.getInternalName()
). May be null.public void visitEnd()
ClassVisitor
visitEnd
in class ClassVisitor