类 TestContextAnnotationUtils

java.lang.Object
cn.taketoday.test.context.TestContextAnnotationUtils

public abstract class TestContextAnnotationUtils extends Object
TestContextAnnotationUtils is a collection of utility methods that complements the standard support already available in AnnotationUtils and AnnotatedElementUtils, while transparently honoring @NestedTestConfiguration semantics.

Mainly for internal use within the TestContext Framework.

Whereas AnnotationUtils and AnnotatedElementUtils provide utilities for getting or finding annotations, TestContextAnnotationUtils goes a step further by providing support for determining the root class on which an annotation is declared, either directly or indirectly via a composed annotation. This additional information is encapsulated in an TestContextAnnotationUtils.AnnotationDescriptor.

The additional information provided by an AnnotationDescriptor is required by the TestContext Framework in order to be able to support class inheritance and enclosing class hierarchy traversals for annotations such as @ContextConfiguration, @TestExecutionListeners, and @ActiveProfiles which offer support for merging and overriding various inherited annotation attributes — for example, ContextConfiguration.inheritLocations().

从以下版本开始:
4.0
作者:
Sam Brannen, Harry Yang
另请参阅:
  • 字段详细资料

  • 构造器详细资料

    • TestContextAnnotationUtils

      public TestContextAnnotationUtils()
  • 方法详细资料

    • hasAnnotation

      public static boolean hasAnnotation(Class<?> clazz, Class<? extends Annotation> annotationType)
      Determine if an annotation of the specified annotationType is present or meta-present on the supplied Class according to the search algorithm used in findMergedAnnotation(Class, Class).

      If this method returns true, then findMergedAnnotation(...) will return a non-null value.

      参数:
      clazz - the class to look for annotations on
      annotationType - the type of annotation to look for
      返回:
      true if a matching annotation is present
      另请参阅:
    • findMergedAnnotation

      @Nullable public static <T extends Annotation> T findMergedAnnotation(Class<?> clazz, Class<T> annotationType)
      Find the first annotation of the specified annotationType within the annotation hierarchy above the supplied class, merge that annotation's attributes with matching attributes from annotations in lower levels of the annotation hierarchy, and synthesize the result back into an annotation of the specified annotationType.

      In the context of this method, the term "above" means within the superclass hierarchy or within the enclosing class hierarchy of the supplied class. The enclosing class hierarchy will only be searched according to @NestedTestConfiguration semantics.

      @AliasFor semantics are fully supported, both within a single annotation and within annotation hierarchies.

      参数:
      clazz - the class to look for annotations on
      annotationType - the type of annotation to look for
      返回:
      the merged, synthesized Annotation, or null if not found
      另请参阅:
    • findMergedAnnotation

      @Nullable private static <T extends Annotation> T findMergedAnnotation(Class<?> clazz, Class<T> annotationType, Predicate<Class<?>> searchEnclosingClass)
    • getMergedRepeatableAnnotations

      public static <T extends Annotation> Set<T> getMergedRepeatableAnnotations(Class<?> clazz, Class<T> annotationType)
      Get all repeatable annotations of the specified annotationType within the annotation hierarchy above the supplied class; and for each annotation found, merge that annotation's attributes with matching attributes from annotations in lower levels of the annotation hierarchy and synthesize the results back into an annotation of the specified annotationType.

      This method will find @Inherited annotations declared on superclasses if the supplied class does not have any local declarations of the repeatable annotation. If no inherited annotations are found, this method will search within the enclosing class hierarchy of the supplied class. The enclosing class hierarchy will only be searched according to @NestedTestConfiguration semantics.

      The container type that holds the repeatable annotations will be looked up via Repeatable.

      @AliasFor semantics are fully supported, both within a single annotation and within annotation hierarchies.

      参数:
      clazz - the class on which to search for annotations (never null)
      annotationType - the annotation type to find (never null)
      返回:
      the set of all merged repeatable annotations found, or an empty set if none were found
      另请参阅:
    • findAnnotationDescriptor

      @Nullable public static <T extends Annotation> TestContextAnnotationUtils.AnnotationDescriptor<T> findAnnotationDescriptor(Class<?> clazz, Class<T> annotationType)
      Find the TestContextAnnotationUtils.AnnotationDescriptor for the supplied annotationType on the supplied Class, traversing its annotations, interfaces, superclasses, and enclosing classes if no annotation can be found on the given class itself.

      This method explicitly handles class-level annotations which are not declared as inherited as well as meta-annotations.

      The algorithm operates as follows:

      1. Search for the annotation on the given class and return a corresponding AnnotationDescriptor if found.
      2. Recursively search through all annotations that the given class declares.
      3. Recursively search through all interfaces implemented by the given class.
      4. Recursively search through the superclass hierarchy of the given class.
      5. Recursively search through the enclosing class hierarchy of the given class if appropriate according to @NestedTestConfiguration semantics.

      In this context, the term recursively means that the search process continues by returning to step #1 with the current annotation, interface, superclass, or enclosing class as the class to look for annotations on.

      参数:
      clazz - the class to look for annotations on
      annotationType - the type of annotation to look for
      返回:
      the corresponding annotation descriptor if the annotation was found; otherwise null
      另请参阅:
    • findAnnotationDescriptor

      @Nullable private static <T extends Annotation> TestContextAnnotationUtils.AnnotationDescriptor<T> findAnnotationDescriptor(@Nullable Class<?> clazz, Class<T> annotationType, Predicate<Class<?>> searchEnclosingClass, Set<Annotation> visited)
      Perform the search algorithm for findAnnotationDescriptor(Class, Class), avoiding endless recursion by tracking which annotations have already been visited.
      参数:
      clazz - the class to look for annotations on
      annotationType - the type of annotation to look for
      searchEnclosingClass - a predicate which evaluates to true if a search should be performed on the enclosing class
      visited - the set of annotations that have already been visited
      返回:
      the corresponding annotation descriptor if the annotation was found; otherwise null
    • findAnnotationDescriptorForTypes

      @Nullable public static TestContextAnnotationUtils.UntypedAnnotationDescriptor findAnnotationDescriptorForTypes(Class<?> clazz, Class<? extends Annotation>... annotationTypes)
      Find the TestContextAnnotationUtils.UntypedAnnotationDescriptor for the first Class in the inheritance hierarchy of the specified clazz (including the specified clazz itself) which declares at least one of the specified annotationTypes.

      This method traverses the annotations, interfaces, superclasses, and enclosing classes of the specified clazz if no annotation can be found on the given class itself.

      This method explicitly handles class-level annotations which are not declared as inherited as well as meta-annotations.

      The algorithm operates as follows:

      1. Search for a local declaration of one of the annotation types on the given class and return a corresponding UntypedAnnotationDescriptor if found.
      2. Recursively search through all annotations that the given class declares.
      3. Recursively search through all interfaces implemented by the given class.
      4. Recursively search through the superclass hierarchy of the given class.
      5. Recursively search through the enclosing class hierarchy of the given class if appropriate according to @NestedTestConfiguration semantics.

      In this context, the term recursively means that the search process continues by returning to step #1 with the current annotation, interface, superclass, or enclosing class as the class to look for annotations on.

      参数:
      clazz - the class to look for annotations on
      annotationTypes - the types of annotations to look for
      返回:
      the corresponding annotation descriptor if one of the annotations was found; otherwise null
      另请参阅:
    • findAnnotationDescriptorForTypes

      @Nullable private static TestContextAnnotationUtils.UntypedAnnotationDescriptor findAnnotationDescriptorForTypes(@Nullable Class<?> clazz, Class<? extends Annotation>[] annotationTypes, Set<Annotation> visited)
      Perform the search algorithm for findAnnotationDescriptorForTypes(Class, Class...), avoiding endless recursion by tracking which annotations have already been visited.
      参数:
      clazz - the class to look for annotations on
      annotationTypes - the types of annotations to look for
      visited - the set of annotations that have already been visited
      返回:
      the corresponding annotation descriptor if one of the annotations was found; otherwise null
    • searchEnclosingClass

      public static boolean searchEnclosingClass(Class<?> clazz)
      Determine if annotations on the enclosing class of the supplied class should be searched by annotation search algorithms within the Infra TestContext Framework.
      参数:
      clazz - the class whose enclosing class should potentially be searched
      返回:
      true if the supplied class is an inner class whose enclosing class should be searched
      另请参阅:
    • clearCaches

      static void clearCaches()
    • getEnclosingConfiguration

      private static NestedTestConfiguration.EnclosingConfiguration getEnclosingConfiguration(Class<?> clazz)
      Get the NestedTestConfiguration.EnclosingConfiguration mode for the supplied class.
      参数:
      clazz - the class for which the enclosing configuration mode should be resolved
      返回:
      the resolved enclosing configuration mode
    • lookUpEnclosingConfiguration

      private static NestedTestConfiguration.EnclosingConfiguration lookUpEnclosingConfiguration(Class<?> clazz)
    • getDefaultEnclosingConfigurationMode

      private static NestedTestConfiguration.EnclosingConfiguration getDefaultEnclosingConfigurationMode()
    • assertNonEmptyAnnotationTypeArray

      private static void assertNonEmptyAnnotationTypeArray(Class<?>[] annotationTypes, String message)