Package javassist.bytecode

# Class AnnotationsAttribute

java.lang.Object
javassist.bytecode.AttributeInfo
javassist.bytecode.AnnotationsAttribute

public class AnnotationsAttribute extends AttributeInfo
A class representing `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:
  - `AnnotationDefaultAttribute`
  - `Annotation`

## Field Summary

Fields
Modifier and Type
Field
Description
`static final String`
`invisibleTag`
The name of the `RuntimeInvisibleAnnotations` attribute.
`static final String`
`visibleTag`
The name of the `RuntimeVisibleAnnotations` attribute.

## Constructor Summary

Constructors
Constructor
Description
`AnnotationsAttribute(ConstPool cp, String attrname)`
Constructs an empty `Runtime(In)VisibleAnnotations_attribute`.
`AnnotationsAttribute(ConstPool cp, String attrname, byte[] info)`
Constructs a `Runtime(In)VisibleAnnotations_attribute`.

## Method Summary

Modifier and Type
Method
Description
`void`
`addAnnotation(Annotation annotation)`
Adds an annotation.
`AttributeInfo`
`copy(ConstPool newCp, Map<String,String> classnames)`
Copies this attribute and returns a new copy.
`Annotation`
`getAnnotation(String type)`
Parses the annotations and returns a data structure representing the annotation with the specified type.
`Annotation[]`
`getAnnotations()`
Parses the annotations and returns a data structure representing that parsed annotations.
`int`
`numAnnotations()`
Returns `num_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 of `Annotation` objects.
`String`
`toString()`
Returns a string representation of this object.

### Methods inherited from class javassist.bytecode.AttributeInfo

`get, getConstPool, getName, length, set`

### Methods inherited from class java.lang.Object

`equals, getClass, hashCode, notify, notifyAll, wait, wait, wait`

## Field Details

### visibleTag

public static final String visibleTag
The name of the `RuntimeVisibleAnnotations` attribute.

See Also:
  - Constant Field Values

### invisibleTag

public static final String invisibleTag
The name of the `RuntimeInvisibleAnnotations` attribute.

See Also:
  - Constant Field Values

## Constructor Details

### AnnotationsAttribute

public AnnotationsAttribute(ConstPool cp, String attrname, byte[] info)
Constructs a `Runtime(In)VisibleAnnotations_attribute`.

Parameters:
  `cp` - constant pool
  `attrname` - attribute name (`visibleTag` or `invisibleTag`).
  `info` - the contents of this attribute. It does not include `attribute_name_index` or `attribute_length`.

### AnnotationsAttribute

public AnnotationsAttribute(ConstPool cp, String attrname)
Constructs an empty `Runtime(In)VisibleAnnotations_attribute`. A new annotation can be later added to the created attribute by `setAnnotations()`.

Parameters:
  `cp` - constant pool
  `attrname` - attribute name (`visibleTag` or `invisibleTag`).
See Also:
  - `setAnnotations(Annotation[])`

## Method Details

### numAnnotations

public int numAnnotations()
Returns `num_annotations`.

### copy

public AttributeInfo copy(ConstPool newCp, Map<String,String> classnames)
Copies this attribute and returns a new copy.

Overrides:
  `copy` in class `AttributeInfo`
Parameters:
  `newCp` - the constant pool table used by the new copy.
  `classnames` - pairs of replaced and substituted class names.

### getAnnotation

public Annotation getAnnotation(String type)
Parses the annotations and returns a data structure representing the annotation with the specified type. See also `getAnnotations()` as to the returned data structure.

Parameters:
  `type` - the annotation type.
Returns:
  null if the specified annotation type is not included.
See Also:
  - `getAnnotations()`

### addAnnotation

public void addAnnotation(Annotation annotation)
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

public boolean removeAnnotation(String type)
Removes an annotation by type. After removing an annotation, if `numAnnotations()` 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

public Annotation[] 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 by `setAnnotations()`.

See Also:
  - `setAnnotations(Annotation[])`

### setAnnotations

public void setAnnotations(Annotation[] annotations)
Changes the annotations represented by this object according to the given array of `Annotation` objects.

Parameters:
  `annotations` - the data structure representing the new annotations.

### setAnnotation

public void setAnnotation(Annotation annotation)
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

public String toString()
Returns a string representation of this object.

Overrides:
  `toString` in class `Object`