Class CtBehavior
- Direct Known Subclasses:
CtConstructor,CtMethod
CtBehavior represents a method, a constructor,
or a static constructor (class initializer).
It is the abstract super class of
CtMethod and CtConstructor.
To directly read or modify bytecode, obtain MethodInfo
objects.
- See Also:
-
Method Summary
Modifier and TypeMethodDescriptionvoidAdds a catch clause that handles an exception thrown in the body.voidAdds a catch clause that handles an exception thrown in the body.voidaddLocalVariable(String name, CtClass type) Declares a new local variable.voidaddParameter(CtClass type) Appends a new parameter, which becomes the last parameter.getAnnotation(Class<?> clz) Returns the annotation if the class has the specified annotation class.Object[]Returns the annotations associated with this method or constructor.byte[]getAttribute(String name) Obtains an attribute with the given name.Object[]Returns the annotations associated with this method or constructor.Object[][]Returns the parameter annotations associated with this method or constructor.CtClass[]Obtains exceptions that this method/constructor may throw.Returns the generic signature of the method.abstract StringReturns the method or constructor name followed by parameter types such asjavassist.CtBehavior.stBody(String).Returns theMethodInforepresenting this method/constructor in the class file.Returns theMethodInforepresenting the method/constructor in the class file (read only).intObtains the modifiers of the method/constructor.Object[][]Returns the parameter annotations associated with this method or constructor.CtClass[]Obtains parameter types of this method/constructor.Returns the method signature (the parameter types and the return type).booleanhasAnnotation(String typeName) Returns true if the class has the specified annotation type.voidinsertAfter(String src) Inserts bytecode at the end of the body.voidinsertAfter(String src, boolean asFinally) Inserts bytecode at the end of the body.voidinsertAfter(String src, boolean asFinally, boolean redundant) Inserts bytecode at the end of the body.intInserts bytecode at the specified line in the body.intInserts bytecode at the specified line in the body.voidinsertBefore(String src) Inserts bytecode at the beginning of the body.voidinsertParameter(CtClass type) Inserts a new parameter, which becomes the first parameter.voidinstrument(CodeConverter converter) Modifies the method/constructor body.voidinstrument(ExprEditor editor) Modifies the method/constructor body.abstract booleanisEmpty()Returns true if the body is empty.voidsetAttribute(String name, byte[] data) Adds an attribute.voidSets a method/constructor body.voidSets a method/constructor body.voidsetExceptionTypes(CtClass[] types) Sets exceptions that this method/constructor may throw.voidSet the generic signature of the method.voidsetModifiers(int mod) Sets the encoded modifiers of the method/constructor.voidDeclares to use$cflowfor this method/constructor.Methods inherited from class javassist.CtMember
getDeclaringClass, getName, hasAnnotation, toString, visibleFrom
-
Method Details
-
getLongName
Returns the method or constructor name followed by parameter types such asjavassist.CtBehavior.stBody(String).- Since:
- 3.5
-
getMethodInfo
Returns theMethodInforepresenting this method/constructor in the class file.If you modify the bytecode through the returned
MethodInfoobject, you might have to explicitly rebuild a stack map table. Javassist does not automatically rebuild it for avoiding unnecessary rebuilding.- See Also:
-
getMethodInfo2
Returns theMethodInforepresenting the method/constructor in the class file (read only). Normal applications do not need calling this method. UsegetMethodInfo().The
MethodInfoobject obtained by this method is read only. Changes to this object might not be reflected on a class file generated bytoBytecode(),toClass(), etc inCtClass.This method is available even if the
CtClasscontaining this method is frozen. However, if the class is frozen, theMethodInfomight be also pruned.- See Also:
-
getModifiers
public int getModifiers()Obtains the modifiers of the method/constructor.- Specified by:
getModifiersin classCtMember- Returns:
- modifiers encoded with
javassist.Modifier. - See Also:
-
setModifiers
public void setModifiers(int mod) Sets the encoded modifiers of the method/constructor.Changing the modifiers may cause a problem. For example, if a non-static method is changed to static, the method will be rejected by the bytecode verifier.
- Specified by:
setModifiersin classCtMember- See Also:
-
hasAnnotation
Returns true if the class has the specified annotation type.- Specified by:
hasAnnotationin classCtMember- Parameters:
typeName- the name of annotation type.- Returns:
trueif the annotation is found, otherwisefalse.- Since:
- 3.21
-
getAnnotation
Returns the annotation if the class has the specified annotation class. For example, if an annotation@Authoris associated with this method/constructor, anAuthorobject is returned. The member values can be obtained by calling methods on theAuthorobject.- Specified by:
getAnnotationin classCtMember- Parameters:
clz- the annotation class.- Returns:
- the annotation if found, otherwise
null. - Throws:
ClassNotFoundException- Since:
- 3.11
-
getAnnotations
Returns the annotations associated with this method or constructor.- Specified by:
getAnnotationsin classCtMember- Returns:
- an array of annotation-type objects.
- Throws:
ClassNotFoundException- Since:
- 3.1
- See Also:
-
getAvailableAnnotations
Returns the annotations associated with this method or constructor. If any annotations are not on the classpath, they are not included in the returned array.- Specified by:
getAvailableAnnotationsin classCtMember- Returns:
- an array of annotation-type objects.
- Since:
- 3.3
- See Also:
-
getParameterAnnotations
Returns the parameter annotations associated with this method or constructor.- Returns:
- an array of annotation-type objects. The length of the returned array is equal to the number of the formal parameters. If each parameter has no annotation, the elements of the returned array are empty arrays.
- Throws:
ClassNotFoundException- Since:
- 3.1
- See Also:
-
getAvailableParameterAnnotations
Returns the parameter annotations associated with this method or constructor. If any annotations are not on the classpath, they are not included in the returned array.- Returns:
- an array of annotation-type objects. The length of the returned array is equal to the number of the formal parameters. If each parameter has no annotation, the elements of the returned array are empty arrays.
- Since:
- 3.3
- See Also:
-
getParameterTypes
Obtains parameter types of this method/constructor.- Throws:
NotFoundException
-
getSignature
Returns the method signature (the parameter types and the return type). The method signature is represented by a character string called method descriptor, which is defined in the JVM specification. If two methods/constructors have the same parameter types and the return type,getSignature()returns the same string (the return type of constructors isvoid).Note that the returned string is not the type signature contained in the
SignatureAttirbute. It is a descriptor.- Specified by:
getSignaturein classCtMember- See Also:
-
getGenericSignature
Returns the generic signature of the method. It represents parameter types including type variables.- Specified by:
getGenericSignaturein classCtMember- Since:
- 3.17
- See Also:
-
setGenericSignature
Set the generic signature of the method. It represents parameter types including type variables. SeeCtClass.setGenericSignature(String)for a code sample.- Specified by:
setGenericSignaturein classCtMember- Parameters:
sig- a new generic signature.- Since:
- 3.17
- See Also:
-
getExceptionTypes
Obtains exceptions that this method/constructor may throw.- Returns:
- a zero-length array if there is no throws clause.
- Throws:
NotFoundException
-
setExceptionTypes
Sets exceptions that this method/constructor may throw.- Throws:
NotFoundException
-
isEmpty
public abstract boolean isEmpty()Returns true if the body is empty. -
setBody
Sets a method/constructor body.- Parameters:
src- the source code representing the body. It must be a single statement or block. If it isnull, the substituted body does nothing except returning zero or null.- Throws:
CannotCompileException
-
setBody
public void setBody(String src, String delegateObj, String delegateMethod) throws CannotCompileException Sets a method/constructor body.- Parameters:
src- the source code representing the body. It must be a single statement or block. If it isnull, the substituted body does nothing except returning zero or null.delegateObj- the source text specifying the object that is called on by$proceed().delegateMethod- the name of the method that is called by$proceed().- Throws:
CannotCompileException
-
getAttribute
Obtains an attribute with the given name. If that attribute is not found in the class file, this method returns null.Note that an attribute is a data block specified by the class file format. It is not an annotation. See
AttributeInfo.- Specified by:
getAttributein classCtMember- Parameters:
name- attribute name
-
setAttribute
Adds an attribute. The attribute is saved in the class file.Note that an attribute is a data block specified by the class file format. It is not an annotation. See
AttributeInfo.- Specified by:
setAttributein classCtMember- Parameters:
name- attribute namedata- attribute value
-
useCflow
Declares to use$cflowfor this method/constructor. If$cflowis used, the class files modified with Javassist requires a support classjavassist.runtime.Cflowat runtime (other Javassist classes are not required at runtime).Every
$cflowvariable is given a unique name. For example, if the given name is"Point.paint", then the variable is indicated by$cflow(Point.paint).- Parameters:
name-$cflowname. It can include alphabets, numbers,_,$, and.(dot).- Throws:
CannotCompileException- See Also:
-
addLocalVariable
Declares a new local variable. The scope of this variable is the whole method body. The initial value of that variable is not set. The declared variable can be accessed in the code snippet inserted byinsertBefore(),insertAfter(), etc.If the second parameter
asFinallytoinsertAfter()is true, the declared local variable is not visible from the code inserted byinsertAfter().- Parameters:
name- the name of the variabletype- the type of the variable- Throws:
CannotCompileException- See Also:
-
insertParameter
Inserts a new parameter, which becomes the first parameter.- Throws:
CannotCompileException
-
addParameter
Appends a new parameter, which becomes the last parameter.- Throws:
CannotCompileException
-
instrument
Modifies the method/constructor body.- Parameters:
converter- specifies how to modify.- Throws:
CannotCompileException
-
instrument
Modifies the method/constructor body.While executing this method, only
replace()inExpris available for bytecode modification. Other methods such asinsertBefore()may collapse the bytecode because theExprEditorloses its current position.- Parameters:
editor- specifies how to modify.- Throws:
CannotCompileException- See Also:
-
insertBefore
Inserts bytecode at the beginning of the body.If this object represents a constructor, the bytecode is inserted before a constructor in the super class or this class is called. Therefore, the inserted bytecode is subject to constraints described in Section 4.8.2 of The Java Virtual Machine Specification (2nd ed). For example, it cannot access instance fields or methods although it may assign a value to an instance field directly declared in this class. Accessing static fields and methods is allowed. Use
insertBeforeBody()inCtConstructor.- Parameters:
src- the source code representing the inserted bytecode. It must be a single statement or block.- Throws:
CannotCompileException- See Also:
-
insertAfter
Inserts bytecode at the end of the body. The bytecode is inserted just before every return instruction. It is not executed when an exception is thrown.- Parameters:
src- the source code representing the inserted bytecode. It must be a single statement or block.- Throws:
CannotCompileException
-
insertAfter
Inserts bytecode at the end of the body. The bytecode is inserted just before every return instruction.- Parameters:
src- the source code representing the inserted bytecode. It must be a single statement or block.asFinally- true if the inserted bytecode is executed not only when the control normally returns but also when an exception is thrown. If this parameter is true, the inserted code cannot access local variables.- Throws:
CannotCompileException
-
insertAfter
public void insertAfter(String src, boolean asFinally, boolean redundant) throws CannotCompileException Inserts bytecode at the end of the body. The bytecode is inserted just before every return instruction.- Parameters:
src- the source code representing the inserted bytecode. It must be a single statement or block.asFinally- true if the inserted bytecode is executed not only when the control normally returns but also when an exception is thrown. If this parameter is true, the inserted code cannot access local variables.redundant- if true, redundant bytecode will be generated. the redundancy is necessary when some compilers (Kotlin?) generate the original bytecode. The otherinsertAftermethods calls this method withfalsefor this parameter. A tip is to passthis.getDeclaringClass().isKotlin()to this parameter.- Throws:
CannotCompileException- Since:
- 3.26
- See Also:
-
addCatch
Adds a catch clause that handles an exception thrown in the body. The catch clause must end with a return or throw statement.- Parameters:
src- the source code representing the catch clause. It must be a single statement or block.exceptionType- the type of the exception handled by the catch clause.- Throws:
CannotCompileException
-
addCatch
public void addCatch(String src, CtClass exceptionType, String exceptionName) throws CannotCompileException Adds a catch clause that handles an exception thrown in the body. The catch clause must end with a return or throw statement.- Parameters:
src- the source code representing the catch clause. It must be a single statement or block.exceptionType- the type of the exception handled by the catch clause.exceptionName- the name of the variable containing the caught exception, for example,$e.- Throws:
CannotCompileException
-
insertAt
Inserts bytecode at the specified line in the body. It is equivalent to:insertAt(lineNum, true, src)
See this method as well.- Parameters:
lineNum- the line number. The bytecode is inserted at the beginning of the code at the line specified by this line number.src- the source code representing the inserted bytecode. It must be a single statement or block.- Returns:
- the line number at which the bytecode has been inserted.
- Throws:
CannotCompileException- See Also:
-
insertAt
Inserts bytecode at the specified line in the body.If there is not a statement at the specified line, the bytecode might be inserted at the line including the first statement after that line specified. For example, if there is only a closing brace at that line, the bytecode would be inserted at another line below. To know exactly where the bytecode will be inserted, call with
modifyset tofalse.- Parameters:
lineNum- the line number. The bytecode is inserted at the beginning of the code at the line specified by this line number.modify- if false, this method does not insert the bytecode. It instead only returns the line number at which the bytecode would be inserted.src- the source code representing the inserted bytecode. It must be a single statement or block. If modify is false, the value of src can be null.- Returns:
- the line number at which the bytecode has been inserted.
- Throws:
CannotCompileException
-