DISCLAIMER
These utilities are intended solely for usage within the JUnit framework itself. Any usage by external parties is not supported. Use at your own risk!
Some utilities are published via the maintained AnnotationSupport
class.
- Since:
- 1.0
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final ConcurrentHashMap<Class<? extends Annotation>, Boolean> -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionfindAnnotatedFields(Class<?> clazz, Class<? extends Annotation> annotationType, Predicate<Field> predicate) findAnnotatedFields(Class<?> clazz, Class<? extends Annotation> annotationType, Predicate<Field> predicate, ReflectionUtils.HierarchyTraversalMode traversalMode) Find all fields of the supplied class or interface that are annotated or meta-annotated with the specifiedannotationTypeand match the specifiedpredicate.findAnnotatedMethods(Class<?> clazz, Class<? extends Annotation> annotationType, ReflectionUtils.HierarchyTraversalMode traversalMode) static <A extends Annotation>
Optional<A> findAnnotation(Class<?> clazz, Class<A> annotationType, boolean searchEnclosingClasses) Find the first annotation of the specified type that is either directly present, meta-present, or indirectly present on the supplied class, optionally searching recursively through the enclosing class hierarchy if not found on the supplied class.static <A extends Annotation>
Optional<A> findAnnotation(AnnotatedElement element, Class<A> annotationType) private static <A extends Annotation>
Optional<A> findAnnotation(AnnotatedElement element, Class<A> annotationType, boolean inherited, Set<Annotation> visited) static <A extends Annotation>
Optional<A> findAnnotation(Parameter parameter, int index, Class<A> annotationType) static <A extends Annotation>
Optional<A> findAnnotation(Optional<? extends AnnotatedElement> element, Class<A> annotationType) private static <A extends Annotation>
Optional<A> findMetaAnnotation(Class<A> annotationType, Annotation[] candidates, boolean inherited, Set<Annotation> visited) findPublicAnnotatedFields(Class<?> clazz, Class<?> fieldType, Class<? extends Annotation> annotationType) private static <A extends Annotation>
voidfindRepeatableAnnotations(Annotation[] candidates, Class<A> annotationType, Class<? extends Annotation> containerType, boolean inherited, Set<A> found, Set<Annotation> visited) static <A extends Annotation>
List<A> findRepeatableAnnotations(AnnotatedElement element, Class<A> annotationType) private static <A extends Annotation>
voidfindRepeatableAnnotations(AnnotatedElement element, Class<A> annotationType, Class<? extends Annotation> containerType, boolean inherited, Set<A> found, Set<Annotation> visited) static <A extends Annotation>
List<A> findRepeatableAnnotations(Parameter parameter, int index, Class<A> annotationType) static <A extends Annotation>
List<A> findRepeatableAnnotations(Optional<? extends AnnotatedElement> element, Class<A> annotationType) private static AnnotatedElementgetEffectiveAnnotatedParameter(Parameter parameter, int index) Due to a bug injavacon JDK versions prior to JDK 9, looking up annotations directly on aParameterwill fail for inner class constructors.static booleanisAnnotated(AnnotatedElement element, Class<? extends Annotation> annotationType) Determine if an annotation ofannotationTypeis either present or meta-present on the suppliedelement.static booleanisAnnotated(Parameter parameter, int index, Class<? extends Annotation> annotationType) static booleanisAnnotated(Optional<? extends AnnotatedElement> element, Class<? extends Annotation> annotationType) Determine if an annotation ofannotationTypeis either present or meta-present on the supplied optionalelement.private static booleanisInJavaLangAnnotationPackage(Class<? extends Annotation> annotationType) private static booleanisRepeatableAnnotationContainer(Class<? extends Annotation> candidateContainerType) Determine if the supplied annotation type is a container for a repeatable annotation.
-
Field Details
-
repeatableAnnotationContainerCache
private static final ConcurrentHashMap<Class<? extends Annotation>,Boolean> repeatableAnnotationContainerCache
-
-
Constructor Details
-
AnnotationUtils
private AnnotationUtils()
-
-
Method Details
-
isAnnotated
public static boolean isAnnotated(Optional<? extends AnnotatedElement> element, Class<? extends Annotation> annotationType) Determine if an annotation ofannotationTypeis either present or meta-present on the supplied optionalelement.- See Also:
-
isAnnotated
public static boolean isAnnotated(Parameter parameter, int index, Class<? extends Annotation> annotationType) - Since:
- 1.8
- See Also:
-
isAnnotated
public static boolean isAnnotated(AnnotatedElement element, Class<? extends Annotation> annotationType) Determine if an annotation ofannotationTypeis either present or meta-present on the suppliedelement.- Parameters:
element- the element on which to search for the annotation; may benullannotationType- the annotation type to search for; nevernull- Returns:
trueif the annotation is present or meta-present- See Also:
-
findAnnotation
public static <A extends Annotation> Optional<A> findAnnotation(Optional<? extends AnnotatedElement> element, Class<A> annotationType) - See Also:
-
findAnnotation
public static <A extends Annotation> Optional<A> findAnnotation(Parameter parameter, int index, Class<A> annotationType) - Since:
- 1.8
- See Also:
-
findAnnotation
public static <A extends Annotation> Optional<A> findAnnotation(AnnotatedElement element, Class<A> annotationType) - See Also:
-
findAnnotation
private static <A extends Annotation> Optional<A> findAnnotation(AnnotatedElement element, Class<A> annotationType, boolean inherited, Set<Annotation> visited) -
findMetaAnnotation
private static <A extends Annotation> Optional<A> findMetaAnnotation(Class<A> annotationType, Annotation[] candidates, boolean inherited, Set<Annotation> visited) -
findAnnotation
public static <A extends Annotation> Optional<A> findAnnotation(Class<?> clazz, Class<A> annotationType, boolean searchEnclosingClasses) Find the first annotation of the specified type that is either directly present, meta-present, or indirectly present on the supplied class, optionally searching recursively through the enclosing class hierarchy if not found on the supplied class.The enclosing class hierarchy will only be searched above an inner class (i.e., a non-static member class).
- Type Parameters:
A- the annotation type- Parameters:
clazz- the class on which to search for the annotation; may benullannotationType- the annotation type to search for; nevernullsearchEnclosingClasses- whether the enclosing class hierarchy should be searched- Returns:
- an
Optionalcontaining the annotation; nevernullbut potentially empty - Since:
- 1.8
- See Also:
-
findRepeatableAnnotations
public static <A extends Annotation> List<A> findRepeatableAnnotations(Optional<? extends AnnotatedElement> element, Class<A> annotationType) - Since:
- 1.5
- See Also:
-
findRepeatableAnnotations
public static <A extends Annotation> List<A> findRepeatableAnnotations(Parameter parameter, int index, Class<A> annotationType) - Since:
- 1.8
- See Also:
-
findRepeatableAnnotations
public static <A extends Annotation> List<A> findRepeatableAnnotations(AnnotatedElement element, Class<A> annotationType) - See Also:
-
findRepeatableAnnotations
private static <A extends Annotation> void findRepeatableAnnotations(AnnotatedElement element, Class<A> annotationType, Class<? extends Annotation> containerType, boolean inherited, Set<A> found, Set<Annotation> visited) -
findRepeatableAnnotations
private static <A extends Annotation> void findRepeatableAnnotations(Annotation[] candidates, Class<A> annotationType, Class<? extends Annotation> containerType, boolean inherited, Set<A> found, Set<Annotation> visited) -
isRepeatableAnnotationContainer
private static boolean isRepeatableAnnotationContainer(Class<? extends Annotation> candidateContainerType) Determine if the supplied annotation type is a container for a repeatable annotation.- Since:
- 1.5
-
getEffectiveAnnotatedParameter
Due to a bug injavacon JDK versions prior to JDK 9, looking up annotations directly on aParameterwill fail for inner class constructors.Bug in
javacon JDK versions prior to JDK 9The parameter annotations array in the compiled byte code for the user's class excludes an entry for the implicit enclosing instance parameter for an inner class constructor.
Workaround
This method provides a workaround for this off-by-one error by helping JUnit maintainers and extension authors to access annotations on the preceding
Parameterobject (i.e.,index - 1). If the suppliedindexis zero in such situations this method will returnnullsince the parameter for the implicit enclosing instance will never be annotated.WARNING
The
AnnotatedElementreturned by this method should never be cast and treated as aParametersince the metadata (e.g.,Parameter.getName(),Parameter.getType(), etc.) will not match those for the declared parameter at the given index in an inner class constructor for code compiled with JDK 8.- Returns:
- the supplied
Parameter, or the effectiveParameterif the aforementioned bug is detected, ornullif the bug is detected and the suppliedindexis0 - Since:
- 1.8
-
findPublicAnnotatedFields
public static List<Field> findPublicAnnotatedFields(Class<?> clazz, Class<?> fieldType, Class<? extends Annotation> annotationType) - See Also:
-
findAnnotatedFields
public static List<Field> findAnnotatedFields(Class<?> clazz, Class<? extends Annotation> annotationType, Predicate<Field> predicate) - See Also:
-
findAnnotatedFields
public static List<Field> findAnnotatedFields(Class<?> clazz, Class<? extends Annotation> annotationType, Predicate<Field> predicate, ReflectionUtils.HierarchyTraversalMode traversalMode) Find all fields of the supplied class or interface that are annotated or meta-annotated with the specifiedannotationTypeand match the specifiedpredicate.- Parameters:
clazz- the class or interface in which to find the fields; nevernullannotationType- the annotation type to search for; nevernullpredicate- the field filter; nevernulltraversalMode- the hierarchy traversal mode; nevernull- Returns:
- the list of all such fields found; neither
nullnor mutable
-
findAnnotatedMethods
public static List<Method> findAnnotatedMethods(Class<?> clazz, Class<? extends Annotation> annotationType, ReflectionUtils.HierarchyTraversalMode traversalMode) - See Also:
-
isInJavaLangAnnotationPackage
-