org.springframework.core.type.classreading
Class AnnotationMetadataReadingVisitor

java.lang.Object
  extended by org.springframework.core.type.classreading.ClassMetadataReadingVisitor
      extended by org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor
All Implemented Interfaces:
AnnotationMetadata, ClassMetadata

final class AnnotationMetadataReadingVisitor
extends ClassMetadataReadingVisitor
implements AnnotationMetadata

ASM class visitor which looks for the class name and implemented types as well as for the annotations defined on the class, exposing them through the AnnotationMetadata interface.

Since:
2.5
Author:
Juergen Hoeller, Mark Fisher, Costin Leau

Field Summary
private  java.util.Set<java.lang.String> annotationSet
           
private  java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>> attributeMap
           
private  java.lang.ClassLoader classLoader
           
private  java.util.Map<java.lang.String,java.util.Set<java.lang.String>> metaAnnotationMap
           
private  MultiValueMap<java.lang.String,MethodMetadata> methodMetadataMap
           
 
Constructor Summary
AnnotationMetadataReadingVisitor(java.lang.ClassLoader classLoader)
           
 
Method Summary
 java.util.Set<MethodMetadata> getAnnotatedMethods(java.lang.String annotationType)
          Retrieve the method metadata for all methods that are annotated (or meta-annotated) with the given annotation type.
 java.util.Map<java.lang.String,java.lang.Object> getAnnotationAttributes(java.lang.String annotationType)
          Retrieve the attributes of the annotation of the given type, if any (i.e.
 java.util.Map<java.lang.String,java.lang.Object> getAnnotationAttributes(java.lang.String annotationType, boolean classValuesAsString)
          Retrieve the attributes of the annotation of the given type, if any (i.e.
 java.util.Set<java.lang.String> getAnnotationTypes()
          Return the names of all annotation types defined on the underlying class.
 java.util.Set<java.lang.String> getMetaAnnotationTypes(java.lang.String annotationType)
          Return the names of all meta-annotation types defined on the given annotation type of the underlying class.
 boolean hasAnnotatedMethods(java.lang.String annotationType)
          Determine whether the underlying class has any methods that are annotated (or meta-annotated) with the given annotation type.
 boolean hasAnnotation(java.lang.String annotationType)
          Determine whether the underlying class has an annotation of the given type defined.
 boolean hasMetaAnnotation(java.lang.String metaAnnotationType)
          Determine whether the underlying class has an annotation that is itself annotated with the meta-annotation of the given type.
 boolean isAnnotated(java.lang.String annotationType)
          Determine whether the underlying class has an annotation or meta-annotation of the given type defined.
 AnnotationVisitor visitAnnotation(java.lang.String desc, boolean visible)
           
 MethodVisitor visitMethod(int access, java.lang.String name, java.lang.String desc, java.lang.String signature, java.lang.String[] exceptions)
           
 
Methods inherited from class org.springframework.core.type.classreading.ClassMetadataReadingVisitor
getClassName, getEnclosingClassName, getInterfaceNames, getMemberClassNames, getSuperClassName, hasEnclosingClass, hasSuperClass, isAbstract, isConcrete, isFinal, isIndependent, isInterface, visit, visitAttribute, visitEnd, visitField, visitInnerClass, visitOuterClass, visitSource
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.springframework.core.type.ClassMetadata
getClassName, getEnclosingClassName, getInterfaceNames, getMemberClassNames, getSuperClassName, hasEnclosingClass, hasSuperClass, isAbstract, isConcrete, isFinal, isIndependent, isInterface
 

Field Detail

classLoader

private final java.lang.ClassLoader classLoader

annotationSet

private final java.util.Set<java.lang.String> annotationSet

metaAnnotationMap

private final java.util.Map<java.lang.String,java.util.Set<java.lang.String>> metaAnnotationMap

attributeMap

private final java.util.Map<java.lang.String,java.util.Map<java.lang.String,java.lang.Object>> attributeMap

methodMetadataMap

private final MultiValueMap<java.lang.String,MethodMetadata> methodMetadataMap
Constructor Detail

AnnotationMetadataReadingVisitor

public AnnotationMetadataReadingVisitor(java.lang.ClassLoader classLoader)
Method Detail

visitMethod

public MethodVisitor visitMethod(int access,
                                 java.lang.String name,
                                 java.lang.String desc,
                                 java.lang.String signature,
                                 java.lang.String[] exceptions)
Overrides:
visitMethod in class ClassMetadataReadingVisitor

visitAnnotation

public AnnotationVisitor visitAnnotation(java.lang.String desc,
                                         boolean visible)
Overrides:
visitAnnotation in class ClassMetadataReadingVisitor

getAnnotationTypes

public java.util.Set<java.lang.String> getAnnotationTypes()
Description copied from interface: AnnotationMetadata
Return the names of all annotation types defined on the underlying class.

Specified by:
getAnnotationTypes in interface AnnotationMetadata
Returns:
the annotation type names

getMetaAnnotationTypes

public java.util.Set<java.lang.String> getMetaAnnotationTypes(java.lang.String annotationType)
Description copied from interface: AnnotationMetadata
Return the names of all meta-annotation types defined on the given annotation type of the underlying class.

Specified by:
getMetaAnnotationTypes in interface AnnotationMetadata
Parameters:
annotationType - the meta-annotation type to look for
Returns:
the meta-annotation type names

hasAnnotation

public boolean hasAnnotation(java.lang.String annotationType)
Description copied from interface: AnnotationMetadata
Determine whether the underlying class has an annotation of the given type defined.

Specified by:
hasAnnotation in interface AnnotationMetadata
Parameters:
annotationType - the annotation type to look for
Returns:
whether a matching annotation is defined

hasMetaAnnotation

public boolean hasMetaAnnotation(java.lang.String metaAnnotationType)
Description copied from interface: AnnotationMetadata
Determine whether the underlying class has an annotation that is itself annotated with the meta-annotation of the given type.

Specified by:
hasMetaAnnotation in interface AnnotationMetadata
Parameters:
metaAnnotationType - the meta-annotation type to look for
Returns:
whether a matching meta-annotation is defined

isAnnotated

public boolean isAnnotated(java.lang.String annotationType)
Description copied from interface: AnnotationMetadata
Determine whether the underlying class has an annotation or meta-annotation of the given type defined.

This is equivalent to a "hasAnnotation || hasMetaAnnotation" check. If this method returns true, then AnnotationMetadata.getAnnotationAttributes(java.lang.String) will return a non-null Map.

Specified by:
isAnnotated in interface AnnotationMetadata
Parameters:
annotationType - the annotation type to look for
Returns:
whether a matching annotation is defined

getAnnotationAttributes

public java.util.Map<java.lang.String,java.lang.Object> getAnnotationAttributes(java.lang.String annotationType)
Description copied from interface: AnnotationMetadata
Retrieve the attributes of the annotation of the given type, if any (i.e. if defined on the underlying class, as direct annotation or as meta-annotation).

Specified by:
getAnnotationAttributes in interface AnnotationMetadata
Parameters:
annotationType - the annotation type to look for
Returns:
a Map of attributes, with the attribute name as key (e.g. "value") and the defined attribute value as Map value. This return value will be null if no matching annotation is defined.

getAnnotationAttributes

public java.util.Map<java.lang.String,java.lang.Object> getAnnotationAttributes(java.lang.String annotationType,
                                                                                boolean classValuesAsString)
Description copied from interface: AnnotationMetadata
Retrieve the attributes of the annotation of the given type, if any (i.e. if defined on the underlying class, as direct annotation or as meta-annotation).

Specified by:
getAnnotationAttributes in interface AnnotationMetadata
Parameters:
annotationType - the annotation type to look for
classValuesAsString - whether to convert class references to String class names for exposure as values in the returned Map, instead of Class references which might potentially have to be loaded first
Returns:
a Map of attributes, with the attribute name as key (e.g. "value") and the defined attribute value as Map value. This return value will be null if no matching annotation is defined.

hasAnnotatedMethods

public boolean hasAnnotatedMethods(java.lang.String annotationType)
Description copied from interface: AnnotationMetadata
Determine whether the underlying class has any methods that are annotated (or meta-annotated) with the given annotation type.

Specified by:
hasAnnotatedMethods in interface AnnotationMetadata

getAnnotatedMethods

public java.util.Set<MethodMetadata> getAnnotatedMethods(java.lang.String annotationType)
Description copied from interface: AnnotationMetadata
Retrieve the method metadata for all methods that are annotated (or meta-annotated) with the given annotation type.

For any returned method, MethodMetadata.isAnnotated(java.lang.String) will return true for the given annotation type.

Specified by:
getAnnotatedMethods in interface AnnotationMetadata
Parameters:
annotationType - the annotation type to look for
Returns:
a Set of MethodMetadata for methods that have a matching annotation. The return value will be an empty set if no methods match the annotation type.