Class AnnotationsAttribute
RuntimeVisibleAnnotations_attribute
and
RuntimeInvisibleAnnotations_attribute
.
To obtain an AnnotationAttribute object, invoke
getAttribute(AnnotationsAttribute.visibleTag)
in ClassFile
, MethodInfo
,
or FieldInfo
. The obtained attribute is a
runtime visible annotations attribute.
If the parameter is
AnnotationAttribute.invisibleTag
, then the obtained
attribute is a runtime invisible one.
For example,
import javassist.bytecode.annotation.Annotation; : CtMethod m = ... ; MethodInfo minfo = m.getMethodInfo(); AnnotationsAttribute attr = (AnnotationsAttribute) minfo.getAttribute(AnnotationsAttribute.invisibleTag); Annotation an = attr.getAnnotation("Author"); String s = ((StringMemberValue)an.getMemberValue("name")).getValue(); System.out.println("@Author(name=" + s + ")");
This code snippet retrieves an annotation of the type Author
from the MethodInfo
object specified by minfo
.
Then, it prints the value of name
in Author
.
If the annotation type Author
is annotated by a meta annotation:
@Retention(RetentionPolicy.RUNTIME)
Then Author
is visible at runtime. Therefore, the third
statement of the code snippet above must be changed into:
AnnotationsAttribute attr = (AnnotationsAttribute) minfo.getAttribute(AnnotationsAttribute.visibleTag);
The attribute tag must be visibleTag
instead of
invisibleTag
.
If the member value of an annotation is not specified, the default value
is used as that member value. If so, getMemberValue()
in
Annotation
returns null
since the default value is not included in the
AnnotationsAttribute
. It is included in the
AnnotationDefaultAttribute
of the method declared in the
annotation type.
If you want to record a new AnnotationAttribute object, execute the following snippet:
ClassFile cf = ... ; ConstPool cp = cf.getConstPool(); AnnotationsAttribute attr = new AnnotationsAttribute(cp, AnnotationsAttribute.visibleTag); Annotation a = new Annotation("Author", cp); a.addMemberValue("name", new StringMemberValue("Chiba", cp)); attr.setAnnotation(a); cf.addAttribute(attr); cf.setVersionToJava5();
The last statement is necessary if the class file was produced by
javac
of JDK 1.4 or earlier. Otherwise, it is not necessary.
- See Also:
-
Field Summary
-
Constructor Summary
ConstructorDescriptionAnnotationsAttribute
(ConstPool cp, String attrname) Constructs an emptyRuntime(In)VisibleAnnotations_attribute
.AnnotationsAttribute
(ConstPool cp, String attrname, byte[] info) Constructs aRuntime(In)VisibleAnnotations_attribute
. -
Method Summary
Modifier and TypeMethodDescriptionvoid
addAnnotation
(Annotation annotation) Adds an annotation.Copies this attribute and returns a new copy.getAnnotation
(String type) Parses the annotations and returns a data structure representing the annotation with the specified type.Parses the annotations and returns a data structure representing that parsed annotations.int
Returnsnum_annotations
.boolean
removeAnnotation
(String type) Removes an annotation by type.void
setAnnotation
(Annotation annotation) Changes the annotations.void
setAnnotations
(Annotation[] annotations) Changes the annotations represented by this object according to the given array ofAnnotation
objects.toString()
Returns a string representation of this object.Methods inherited from class javassist.bytecode.AttributeInfo
get, getConstPool, getName, length, set
-
Field Details
-
visibleTag
The name of theRuntimeVisibleAnnotations
attribute.- See Also:
-
invisibleTag
The name of theRuntimeInvisibleAnnotations
attribute.- See Also:
-
-
Constructor Details
-
AnnotationsAttribute
Constructs aRuntime(In)VisibleAnnotations_attribute
.- Parameters:
cp
- constant poolattrname
- attribute name (visibleTag
orinvisibleTag
).info
- the contents of this attribute. It does not includeattribute_name_index
orattribute_length
.
-
AnnotationsAttribute
Constructs an emptyRuntime(In)VisibleAnnotations_attribute
. A new annotation can be later added to the created attribute bysetAnnotations()
.- Parameters:
cp
- constant poolattrname
- attribute name (visibleTag
orinvisibleTag
).- See Also:
-
-
Method Details
-
numAnnotations
public int numAnnotations()Returnsnum_annotations
. -
copy
Copies this attribute and returns a new copy.- Overrides:
copy
in classAttributeInfo
- Parameters:
newCp
- the constant pool table used by the new copy.classnames
- pairs of replaced and substituted class names.
-
getAnnotation
Parses the annotations and returns a data structure representing the annotation with the specified type. See alsogetAnnotations()
as to the returned data structure.- Parameters:
type
- the annotation type.- Returns:
- null if the specified annotation type is not included.
- See Also:
-
addAnnotation
Adds an annotation. If there is an annotation with the same type, it is removed before the new annotation is added.- Parameters:
annotation
- the added annotation.
-
removeAnnotation
Removes an annotation by type. After removing an annotation, ifnumAnnotations()
returns 0, this annotations attribute has to be removed.- Parameters:
type
- of annotation to remove- Returns:
- whether an annotation with the given type has been removed
- Since:
- 3.21
-
getAnnotations
Parses the annotations and returns a data structure representing that parsed annotations. Note that changes of the node values of the returned tree are not reflected on the annotations represented by this object unless the tree is copied back to this object bysetAnnotations()
.- See Also:
-
setAnnotations
Changes the annotations represented by this object according to the given array ofAnnotation
objects.- Parameters:
annotations
- the data structure representing the new annotations.
-
setAnnotation
Changes the annotations. A call to this method is equivalent to:setAnnotations(new Annotation[] { annotation })
- Parameters:
annotation
- the data structure representing the new annotation.
-
toString
Returns a string representation of this object.
-