Class 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 java.lang.String invisibleTag
      The name of the RuntimeInvisibleAnnotations attribute.
      static java.lang.String visibleTag
      The name of the RuntimeVisibleAnnotations attribute.
    • Constructor Summary

      Constructors 
      Constructor Description
      AnnotationsAttribute​(ConstPool cp, java.lang.String attrname)
      Constructs an empty Runtime(In)VisibleAnnotations_attribute.
      AnnotationsAttribute​(ConstPool cp, java.lang.String attrname, byte[] info)
      Constructs a Runtime(In)VisibleAnnotations_attribute.
    • Field Detail

      • visibleTag

        public static final java.lang.String visibleTag
        The name of the RuntimeVisibleAnnotations attribute.
        See Also:
        Constant Field Values
      • invisibleTag

        public static final java.lang.String invisibleTag
        The name of the RuntimeInvisibleAnnotations attribute.
        See Also:
        Constant Field Values
    • Constructor Detail

      • AnnotationsAttribute

        public AnnotationsAttribute​(ConstPool cp,
                                    java.lang.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,
                                    java.lang.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 Detail

      • numAnnotations

        public int numAnnotations()
        Returns num_annotations.
      • copy

        public AttributeInfo copy​(ConstPool newCp,
                                  java.util.Map<java.lang.String,​java.lang.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​(java.lang.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​(java.lang.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 java.lang.String toString()
        Returns a string representation of this object.
        Overrides:
        toString in class java.lang.Object