Class ReflectionUtils

java.lang.Object
org.junit.platform.commons.util.ReflectionUtils

@API(status=INTERNAL, since="1.0") public final class ReflectionUtils extends Object
Collection of utilities for working with the Java reflection APIs.

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 ReflectionSupport class.

Since:
1.0
See Also:
  • Method Details

    • isPublic

      public static boolean isPublic(Class<?> clazz)
    • isPublic

      public static boolean isPublic(Member member)
    • isPrivate

      public static boolean isPrivate(Class<?> clazz)
    • isPrivate

      public static boolean isPrivate(Member member)
    • isNotPrivate

      @API(status=INTERNAL, since="1.4") public static boolean isNotPrivate(Class<?> clazz)
    • isNotPrivate

      @API(status=INTERNAL, since="1.1") public static boolean isNotPrivate(Member member)
    • isAbstract

      public static boolean isAbstract(Class<?> clazz)
    • isAbstract

      public static boolean isAbstract(Member member)
    • isStatic

      public static boolean isStatic(Class<?> clazz)
    • isNotStatic

      @API(status=INTERNAL, since="1.4") public static boolean isNotStatic(Class<?> clazz)
    • isStatic

      public static boolean isStatic(Member member)
    • isNotStatic

      @API(status=INTERNAL, since="1.1") public static boolean isNotStatic(Member member)
    • isFinal

      @API(status=INTERNAL, since="1.5") public static boolean isFinal(Class<?> clazz)
      Since:
      1.5
    • isNotFinal

      @API(status=INTERNAL, since="1.5") public static boolean isNotFinal(Class<?> clazz)
      Since:
      1.5
    • isFinal

      @API(status=INTERNAL, since="1.5") public static boolean isFinal(Member member)
      Since:
      1.5
    • isNotFinal

      @API(status=INTERNAL, since="1.5") public static boolean isNotFinal(Member member)
      Since:
      1.5
    • isInnerClass

      public static boolean isInnerClass(Class<?> clazz)
      Determine if the supplied class is an inner class (i.e., a non-static member class).

      Technically speaking (i.e., according to the Java Language Specification), "an inner class may be a non-static member class, a local class, or an anonymous class." However, this method does not return true for a local or anonymous class.

      Parameters:
      clazz - the class to check; never null
      Returns:
      true if the class is an inner class
    • returnsPrimitiveVoid

      public static boolean returnsPrimitiveVoid(Method method)
      Determine if the return type of the supplied method is primitive void.
      Parameters:
      method - the method to test; never null
      Returns:
      true if the method's return type is void
    • isArray

      public static boolean isArray(Object obj)
      Determine if the supplied object is an array.
      Parameters:
      obj - the object to test; potentially null
      Returns:
      true if the object is an array
    • isMultidimensionalArray

      @API(status=INTERNAL, since="1.3.2") public static boolean isMultidimensionalArray(Object obj)
      Determine if the supplied object is a multidimensional array.
      Parameters:
      obj - the object to test; potentially null
      Returns:
      true if the object is a multidimensional array
      Since:
      1.3.2
    • isAssignableTo

      public static boolean isAssignableTo(Class<?> sourceType, Class<?> targetType)
      Determine if an object of the supplied source type can be assigned to the supplied target type for the purpose of reflective method invocations.

      In contrast to Class.isAssignableFrom(Class), this method returns true if the target type represents a primitive type whose wrapper matches the supplied source type. In addition, this method also supports widening conversions for primitive target types.

      Parameters:
      sourceType - the non-primitive target type; never null
      targetType - the target type; never null
      Returns:
      true if an object of the source type is assignment compatible with the target type
      Since:
      1.8
      See Also:
    • isAssignableTo

      public static boolean isAssignableTo(Object obj, Class<?> targetType)
      Determine if the supplied object can be assigned to the supplied target type for the purpose of reflective method invocations.

      In contrast to Class.isInstance(Object), this method returns true if the target type represents a primitive type whose wrapper matches the supplied object's type. In addition, this method also supports widening conversions for primitive types and their corresponding wrapper types.

      If the supplied object is null and the supplied type does not represent a primitive type, this method returns true.

      Parameters:
      obj - the object to test for assignment compatibility; potentially null
      targetType - the type to check against; never null
      Returns:
      true if the object is assignment compatible
      See Also:
    • getWrapperType

      public static Class<?> getWrapperType(Class<?> type)
      Get the wrapper type for the supplied primitive type.
      Parameters:
      type - the primitive type for which to retrieve the wrapper type
      Returns:
      the corresponding wrapper type or null if the supplied type is null or not a primitive type
    • newInstance

      public static <T> T newInstance(Class<T> clazz, Object... args)
      See Also:
    • newInstance

      public static <T> T newInstance(Constructor<T> constructor, Object... args)
      Create a new instance of type T by invoking the supplied constructor with the supplied arguments.

      The constructor will be made accessible if necessary, and any checked exception will be masked as an unchecked exception.

      Parameters:
      constructor - the constructor to invoke; never null
      args - the arguments to pass to the constructor
      Returns:
      the new instance; never null
      See Also:
    • readFieldValue

      @API(status=DEPRECATED, since="1.4") @Deprecated public static <T> Optional<Object> readFieldValue(Class<T> clazz, String fieldName, T instance)
      Deprecated.
      Read the value of a potentially inaccessible or nonexistent field.

      If the field does not exist or the value of the field is null, an empty Optional will be returned.

      Parameters:
      clazz - the class where the field is declared; never null
      fieldName - the name of the field; never null or empty
      instance - the instance from where the value is to be read; may be null for a static field
      See Also:
    • tryToReadFieldValue

      @API(status=INTERNAL, since="1.4") public static <T> Try<Object> tryToReadFieldValue(Class<T> clazz, String fieldName, T instance)
      Try to read the value of a potentially inaccessible or nonexistent field.

      If the field does not exist or an exception occurs while reading it, a failed Try is returned that contains the corresponding exception.

      Parameters:
      clazz - the class where the field is declared; never null
      fieldName - the name of the field; never null or empty
      instance - the instance from where the value is to be read; may be null for a static field
      Since:
      1.4
      See Also:
    • readFieldValue

      @API(status=DEPRECATED, since="1.4") @Deprecated public static Optional<Object> readFieldValue(Field field)
      Deprecated.
      Please use tryToReadFieldValue(Field) instead.
      Read the value of the supplied static field, making it accessible if necessary and masking any checked exception as an unchecked exception.

      If the value of the field is null, an empty Optional will be returned.

      Parameters:
      field - the field to read; never null
      See Also:
    • tryToReadFieldValue

      @API(status=INTERNAL, since="1.4") public static Try<Object> tryToReadFieldValue(Field field)
      Try to read the value of a potentially inaccessible static field.

      If an exception occurs while reading the field, a failed Try is returned that contains the corresponding exception.

      Parameters:
      field - the field to read; never null
      Since:
      1.4
      See Also:
    • readFieldValue

      @API(status=DEPRECATED, since="1.4") @Deprecated public static Optional<Object> readFieldValue(Field field, Object instance)
      Deprecated.
      Read the value of the supplied field, making it accessible if necessary and masking any checked exception as an unchecked exception.

      If the value of the field is null, an empty Optional will be returned.

      Parameters:
      field - the field to read; never null
      instance - the instance from which the value is to be read; may be null for a static field
      See Also:
    • tryToReadFieldValue

      @API(status=INTERNAL, since="1.4") public static Try<Object> tryToReadFieldValue(Field field, Object instance)
      Since:
      1.4
      See Also:
    • readFieldValues

      public static List<Object> readFieldValues(List<Field> fields, Object instance)
      Read the values of the supplied fields, making each field accessible if necessary and masking any checked exception as an unchecked exception.
      Parameters:
      fields - the list of fields to read; never null
      instance - the instance from which the values are to be read; may be null for static fields
      Returns:
      an immutable list of the values of the specified fields; never null but may be empty or contain null entries
    • readFieldValues

      public static List<Object> readFieldValues(List<Field> fields, Object instance, Predicate<Field> predicate)
      Read the values of the supplied fields, making each field accessible if necessary, masking any checked exception as an unchecked exception, and filtering out fields that do not pass the supplied predicate.
      Parameters:
      fields - the list of fields to read; never null
      instance - the instance from which the values are to be read; may be null for static fields
      predicate - the field filter; never null
      Returns:
      an immutable list of the values of the specified fields; never null but may be empty or contain null entries
    • invokeMethod

      public static Object invokeMethod(Method method, Object target, Object... args)
      See Also:
    • loadClass

      @API(status=DEPRECATED, since="1.4") @Deprecated public static Optional<Class<?>> loadClass(String name)
      Deprecated.
      Please use tryToLoadClass(String) instead.
      See Also:
    • tryToLoadClass

      @API(status=INTERNAL, since="1.4") public static Try<Class<?>> tryToLoadClass(String name)
      Since:
      1.4
      See Also:
    • loadClass

      @API(status=DEPRECATED, since="1.4") @Deprecated public static Optional<Class<?>> loadClass(String name, ClassLoader classLoader)
      Deprecated.
      Load a class by its primitive name or fully qualified name, using the supplied ClassLoader.

      See ReflectionSupport.loadClass(String) for details on support for class names for arrays.

      Parameters:
      name - the name of the class to load; never null or blank
      classLoader - the ClassLoader to use; never null
      See Also:
    • loadRequiredClass

      @API(status=INTERNAL, since="1.11") public static Class<?> loadRequiredClass(String name, ClassLoader classLoader) throws JUnitException
      Load a class by its primitive name or fully qualified name, using the supplied ClassLoader.

      See ReflectionSupport.tryToLoadClass(String) for details on support for class names for arrays.

      Parameters:
      name - the name of the class to load; never null or blank
      classLoader - the ClassLoader to use; never null
      Throws:
      JUnitException - if the class could not be loaded
      Since:
      1.11
      See Also:
    • tryToLoadClass

      @API(status=INTERNAL, since="1.4") public static Try<Class<?>> tryToLoadClass(String name, ClassLoader classLoader)
      Try to load a class by its primitive name or fully qualified name, using the supplied ClassLoader.

      See ReflectionSupport.tryToLoadClass(String) for details on support for class names for arrays.

      Parameters:
      name - the name of the class to load; never null or blank
      classLoader - the ClassLoader to use; never null
      Since:
      1.4
      See Also:
    • getFullyQualifiedMethodName

      public static String getFullyQualifiedMethodName(Class<?> clazz, Method method)
      Build the fully qualified method name for the method described by the supplied class and method.

      Note that the class is not necessarily the class in which the method is declared.

      Parameters:
      clazz - the class from which the method should be referenced; never null
      method - the method; never null
      Returns:
      fully qualified method name; never null
      Since:
      1.4
      See Also:
    • getFullyQualifiedMethodName

      public static String getFullyQualifiedMethodName(Class<?> clazz, String methodName, Class<?>... parameterTypes)
      Build the fully qualified method name for the method described by the supplied class, method name, and parameter types.

      Note that the class is not necessarily the class in which the method is declared.

      Parameters:
      clazz - the class from which the method should be referenced; never null
      methodName - the name of the method; never null or blank
      parameterTypes - the parameter types of the method; may be null or empty
      Returns:
      fully qualified method name; never null
    • getFullyQualifiedMethodName

      @API(status=INTERNAL, since="1.11") public static String getFullyQualifiedMethodName(String className, String methodName, String parameterTypeNames)
      Build the fully qualified method name for the method described by the supplied class, method name, and parameter types.

      Note that the class is not necessarily the class in which the method is declared.

      Parameters:
      className - the name of the class from which the method should be referenced; never null
      methodName - the name of the method; never null or blank
      parameterTypeNames - the parameter type names of the method; may be empty but not null
      Returns:
      fully qualified method name; never null
      Since:
      1.11
    • parseFullyQualifiedMethodName

      public static String[] parseFullyQualifiedMethodName(String fullyQualifiedMethodName)
      Parse the supplied fully qualified method name into a 3-element String[] with the following content.
      • index 0: the fully qualified class name
      • index 1: the name of the method
      • index 2: a comma-separated list of parameter types, or a blank string if the method does not declare any formal parameters
      Parameters:
      fullyQualifiedMethodName - a fully qualified method name, never null or blank
      Returns:
      a 3-element array of strings containing the parsed values
    • parseFullyQualifiedFieldName

      @API(status=INTERNAL, since="1.11") public static String[] parseFullyQualifiedFieldName(String fullyQualifiedFieldName)
      Parse the supplied fully qualified field name into a 2-element String[] with the following content.
      • index 0: the fully qualified class name
      • index 1: the name of the field
      Parameters:
      fullyQualifiedFieldName - a fully qualified field name, never null or blank
      Returns:
      a 2-element array of strings containing the parsed values
      Since:
      1.11
    • getAllClasspathRootDirectories

      public static Set<Path> getAllClasspathRootDirectories()
    • findAllClassesInClasspathRoot

      public static List<Class<?>> findAllClassesInClasspathRoot(URI root, Predicate<Class<?>> classFilter, Predicate<String> classNameFilter)
      See Also:
    • streamAllClassesInClasspathRoot

      public static Stream<Class<?>> streamAllClassesInClasspathRoot(URI root, Predicate<Class<?>> classFilter, Predicate<String> classNameFilter)
      Since:
      1.10
      See Also:
    • findAllClassesInClasspathRoot

      public static List<Class<?>> findAllClassesInClasspathRoot(URI root, ClassFilter classFilter)
      Since:
      1.1
    • findAllResourcesInClasspathRoot

      public static List<Resource> findAllResourcesInClasspathRoot(URI root, Predicate<Resource> resourceFilter)
      Since:
      1.11
    • streamAllClassesInClasspathRoot

      public static Stream<Class<?>> streamAllClassesInClasspathRoot(URI root, ClassFilter classFilter)
      Since:
      1.10
    • streamAllResourcesInClasspathRoot

      public static Stream<Resource> streamAllResourcesInClasspathRoot(URI root, Predicate<Resource> resourceFilter)
      Since:
      1.11
    • findAllClassesInPackage

      public static List<Class<?>> findAllClassesInPackage(String basePackageName, Predicate<Class<?>> classFilter, Predicate<String> classNameFilter)
      See Also:
    • streamAllClassesInPackage

      public static Stream<Class<?>> streamAllClassesInPackage(String basePackageName, Predicate<Class<?>> classFilter, Predicate<String> classNameFilter)
      since 1.10
      See Also:
    • findAllClassesInPackage

      public static List<Class<?>> findAllClassesInPackage(String basePackageName, ClassFilter classFilter)
      Since:
      1.1
    • findAllResourcesInPackage

      public static List<Resource> findAllResourcesInPackage(String basePackageName, Predicate<Resource> resourceFilter)
      Since:
      1.11
    • streamAllClassesInPackage

      public static Stream<Class<?>> streamAllClassesInPackage(String basePackageName, ClassFilter classFilter)
      Since:
      1.10
    • streamAllResourcesInPackage

      public static Stream<Resource> streamAllResourcesInPackage(String basePackageName, Predicate<Resource> resourceFilter)
      Since:
      1.11
    • findAllClassesInModule

      public static List<Class<?>> findAllClassesInModule(String moduleName, Predicate<Class<?>> classFilter, Predicate<String> classNameFilter)
      Since:
      1.1.1
      See Also:
    • streamAllClassesInModule

      public static Stream<Class<?>> streamAllClassesInModule(String moduleName, Predicate<Class<?>> classFilter, Predicate<String> classNameFilter)
      Since:
      1.10
      See Also:
    • findAllClassesInModule

      public static List<Class<?>> findAllClassesInModule(String moduleName, ClassFilter classFilter)
      Since:
      1.1.1
    • findAllResourcesInModule

      public static List<Resource> findAllResourcesInModule(String moduleName, Predicate<Resource> resourceFilter)
      Since:
      1.11
    • streamAllClassesInModule

      public static Stream<Class<?>> streamAllClassesInModule(String moduleName, ClassFilter classFilter)
      Since:
      1.10
    • streamAllResourcesInModule

      public static Stream<Resource> streamAllResourcesInModule(String moduleName, Predicate<Resource> resourceFilter)
      Since:
      1.11
    • findNestedClasses

      public static List<Class<?>> findNestedClasses(Class<?> clazz, Predicate<Class<?>> predicate)
      See Also:
    • streamNestedClasses

      public static Stream<Class<?>> streamNestedClasses(Class<?> clazz, Predicate<Class<?>> predicate)
      since 1.10
      See Also:
    • getDeclaredConstructor

      public static <T> Constructor<T> getDeclaredConstructor(Class<T> clazz)
      Get the sole declared, non-synthetic Constructor for the supplied class.

      Throws a PreconditionViolationException if the supplied class declares more than one non-synthetic constructor.

      Parameters:
      clazz - the class to get the constructor for
      Returns:
      the sole declared constructor; never null
      See Also:
    • findConstructors

      public static List<Constructor<?>> findConstructors(Class<?> clazz, Predicate<Constructor<?>> predicate)
      Find all constructors in the supplied class that match the supplied predicate.

      Note that this method may return synthetic constructors. If you wish to ignore synthetic constructors, you may filter them out with the supplied predicate or filter them out of the list returned by this method.

      Parameters:
      clazz - the class in which to search for constructors; never null
      predicate - the predicate to use to test for a match; never null
      Returns:
      an immutable list of all such constructors found; never null but potentially empty
      See Also:
    • findFields

      public static List<Field> findFields(Class<?> clazz, Predicate<Field> predicate, ReflectionUtils.HierarchyTraversalMode traversalMode)
      See Also:
    • streamFields

      public static Stream<Field> streamFields(Class<?> clazz, Predicate<Field> predicate, ReflectionUtils.HierarchyTraversalMode traversalMode)
      Since:
      1.10
      See Also:
    • isMethodPresent

      public static boolean isMethodPresent(Class<?> clazz, Predicate<Method> predicate)
      Determine if a Method matching the supplied Predicate is present within the type hierarchy of the specified class, beginning with the specified class or interface and traversing up the type hierarchy until such a method is found or the type hierarchy is exhausted.
      Parameters:
      clazz - the class or interface in which to find the method; never null
      predicate - the predicate to use to test for a match; never null
      Returns:
      true if such a method is present
      See Also:
    • tryToGetMethod

      @API(status=INTERNAL, since="1.4") public static Try<Method> tryToGetMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes)
      Try to get the Method in the specified class with the specified name and parameter types.

      This method delegates to Class.getMethod(String, Class...) but catches any exception thrown.

      Parameters:
      clazz - the class in which to search for the method; never null
      methodName - the name of the method to get; never null or blank
      parameterTypes - the parameter types of the method; may be null or empty
      Returns:
      a successful Try containing the method or a failed Try containing the NoSuchMethodException thrown by Class#getMethod(); never null
      Since:
      1.4
    • getInterfaceMethodIfPossible

      @API(status=INTERNAL, since="1.11") public static Method getInterfaceMethodIfPossible(Method method, Class<?> targetClass)
      Determine a corresponding interface method for the given method handle, if possible.

      This is particularly useful for arriving at a public exported type on the Java Module System which can be reflectively invoked without an illegal access warning.

      Parameters:
      method - the method to be invoked, potentially from an implementation class; never null
      targetClass - the target class to check for declared interfaces; potentially null
      Returns:
      the corresponding interface method, or the original method if none found
      Since:
      1.11
    • findMethod

      public static Optional<Method> findMethod(Class<?> clazz, String methodName, String parameterTypeNames)
      See Also:
    • resolveParameterTypes

      @API(status=INTERNAL, since="1.10") public static Class<?>[] resolveParameterTypes(Class<?> clazz, String methodName, String parameterTypeNames)
    • findMethod

      public static Optional<Method> findMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes)
      See Also:
    • getRequiredMethod

      @API(status=STABLE, since="1.7") public static Method getRequiredMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes)
      Find the first Method of the supplied class or interface that meets the specified criteria, beginning with the specified class or interface and traversing up the type hierarchy until such a method is found or the type hierarchy is exhausted.

      Use this method as an alternative to findMethod(Class, String, Class...) for use cases in which the method is required to be present.

      Parameters:
      clazz - the class or interface in which to find the method; never null
      methodName - the name of the method to find; never null or empty
      parameterTypes - the types of parameters accepted by the method, if any; never null
      Returns:
      the Method found; never null
      Throws:
      JUnitException - if no method is found
      Since:
      1.7
      See Also:
    • findMethods

      public static List<Method> findMethods(Class<?> clazz, Predicate<Method> predicate)
      Find all methods of the supplied class or interface that match the specified predicate, using top-down search semantics within the type hierarchy.

      The results will not contain instance methods that are overridden.

      Parameters:
      clazz - the class or interface in which to find the methods; never null
      predicate - the method filter; never null
      Returns:
      an immutable list of all such methods found; never null
      See Also:
    • findMethods

      public static List<Method> findMethods(Class<?> clazz, Predicate<Method> predicate, ReflectionUtils.HierarchyTraversalMode traversalMode)
      See Also:
    • streamMethods

      public static Stream<Method> streamMethods(Class<?> clazz, Predicate<Method> predicate, ReflectionUtils.HierarchyTraversalMode traversalMode)
      Since:
      1.10
      See Also:
    • makeAccessible

      @API(status=INTERNAL, since="1.11") public static <T extends Executable> T makeAccessible(T executable)
    • makeAccessible

      @API(status=INTERNAL, since="1.11") public static Field makeAccessible(Field field)
    • getAllAssignmentCompatibleClasses

      public static Set<Class<?>> getAllAssignmentCompatibleClasses(Class<?> clazz)
      Return all classes and interfaces that can be used as assignment types for instances of the specified Class, including itself.
      Parameters:
      clazz - the Class to look up
      See Also: