public abstract class ReflectionUtils
extends java.lang.Object
Only intended for internal use.
Modifier and Type | Class and Description |
---|---|
static interface |
ReflectionUtils.FieldCallback
Callback interface invoked on each field in the hierarchy.
|
static interface |
ReflectionUtils.FieldFilter
Callback optionally used to filter fields to be operated on by a field callback.
|
static interface |
ReflectionUtils.MethodCallback
Action to take on each method.
|
static interface |
ReflectionUtils.MethodFilter
Callback optionally used to filter methods to be operated on by a method callback.
|
Modifier and Type | Field and Description |
---|---|
private static java.lang.String |
CGLIB_RENAMED_METHOD_PREFIX
Naming prefix for CGLIB-renamed methods.
|
static ReflectionUtils.FieldFilter |
COPYABLE_FIELDS
Pre-built FieldFilter that matches all non-static, non-final fields.
|
private static java.util.Map<java.lang.Class<?>,java.lang.reflect.Field[]> |
declaredFieldsCache
Cache for
Class.getDeclaredFields() , allowing for fast iteration. |
private static java.util.Map<java.lang.Class<?>,java.lang.reflect.Method[]> |
declaredMethodsCache
Cache for
Class.getDeclaredMethods() plus equivalent default methods
from Java 8 based interfaces, allowing for fast iteration. |
private static java.lang.Class<?>[] |
EMPTY_CLASS_ARRAY |
private static java.lang.reflect.Field[] |
EMPTY_FIELD_ARRAY |
private static java.lang.reflect.Method[] |
EMPTY_METHOD_ARRAY |
private static java.lang.Object[] |
EMPTY_OBJECT_ARRAY |
static ReflectionUtils.MethodFilter |
USER_DECLARED_METHODS
Pre-built MethodFilter that matches all non-bridge non-synthetic methods
which are not declared on
java.lang.Object . |
Constructor and Description |
---|
ReflectionUtils() |
Modifier and Type | Method and Description |
---|---|
static <T> java.lang.reflect.Constructor<T> |
accessibleConstructor(java.lang.Class<T> clazz,
java.lang.Class<?>... parameterTypes)
Obtain an accessible constructor for the given class and parameters.
|
static void |
clearCache()
Clear the internal method/field cache.
|
static boolean |
declaresException(java.lang.reflect.Method method,
java.lang.Class<?> exceptionType)
Determine whether the given method explicitly declares the given
exception or one of its superclasses, which means that an exception
of that type can be propagated as-is within a reflective invocation.
|
static void |
doWithFields(java.lang.Class<?> clazz,
ReflectionUtils.FieldCallback fc)
Invoke the given callback on all fields in the target class, going up the
class hierarchy to get all declared fields.
|
static void |
doWithFields(java.lang.Class<?> clazz,
ReflectionUtils.FieldCallback fc,
ReflectionUtils.FieldFilter ff)
Invoke the given callback on all fields in the target class, going up the
class hierarchy to get all declared fields.
|
static void |
doWithLocalFields(java.lang.Class<?> clazz,
ReflectionUtils.FieldCallback fc)
Invoke the given callback on all locally declared fields in the given class.
|
static void |
doWithLocalMethods(java.lang.Class<?> clazz,
ReflectionUtils.MethodCallback mc)
Perform the given callback operation on all matching methods of the given
class, as locally declared or equivalent thereof (such as default methods
on Java 8 based interfaces that the given class implements).
|
static void |
doWithMethods(java.lang.Class<?> clazz,
ReflectionUtils.MethodCallback mc)
Perform the given callback operation on all matching methods of the given
class and superclasses.
|
static void |
doWithMethods(java.lang.Class<?> clazz,
ReflectionUtils.MethodCallback mc,
ReflectionUtils.MethodFilter mf)
Perform the given callback operation on all matching methods of the given
class and superclasses (or given interface and super-interfaces).
|
private static java.util.List<java.lang.reflect.Method> |
findConcreteMethodsOnInterfaces(java.lang.Class<?> clazz) |
static java.lang.reflect.Field |
findField(java.lang.Class<?> clazz,
java.lang.String name)
Attempt to find a
field on the supplied Class with the
supplied name . |
static java.lang.reflect.Field |
findField(java.lang.Class<?> clazz,
java.lang.String name,
java.lang.Class<?> type)
Attempt to find a
field on the supplied Class with the
supplied name and/or type . |
static java.lang.reflect.Method |
findMethod(java.lang.Class<?> clazz,
java.lang.String name)
Attempt to find a
Method on the supplied class with the supplied name
and no parameters. |
static java.lang.reflect.Method |
findMethod(java.lang.Class<?> clazz,
java.lang.String name,
java.lang.Class<?>... paramTypes)
Attempt to find a
Method on the supplied class with the supplied name
and parameter types. |
static java.lang.reflect.Method[] |
getAllDeclaredMethods(java.lang.Class<?> leafClass)
Get all declared methods on the leaf class and all superclasses.
|
private static java.lang.reflect.Field[] |
getDeclaredFields(java.lang.Class<?> clazz)
This variant retrieves
Class.getDeclaredFields() from a local cache
in order to avoid the JVM's SecurityManager check and defensive array copying. |
static java.lang.reflect.Method[] |
getDeclaredMethods(java.lang.Class<?> clazz)
Variant of
Class.getDeclaredMethods() that uses a local cache in
order to avoid the JVM's SecurityManager check and new Method instances. |
private static java.lang.reflect.Method[] |
getDeclaredMethods(java.lang.Class<?> clazz,
boolean defensive) |
static java.lang.Object |
getField(java.lang.reflect.Field field,
java.lang.Object target)
Get the field represented by the supplied
field object on the
specified target object . |
static java.lang.reflect.Method[] |
getUniqueDeclaredMethods(java.lang.Class<?> leafClass)
Get the unique set of declared methods on the leaf class and all superclasses.
|
static java.lang.reflect.Method[] |
getUniqueDeclaredMethods(java.lang.Class<?> leafClass,
ReflectionUtils.MethodFilter mf)
Get the unique set of declared methods on the leaf class and all superclasses.
|
static void |
handleInvocationTargetException(java.lang.reflect.InvocationTargetException ex)
Handle the given invocation target exception.
|
static void |
handleReflectionException(java.lang.Exception ex)
Handle the given reflection exception.
|
static java.lang.Object |
invokeMethod(java.lang.reflect.Method method,
java.lang.Object target)
Invoke the specified
Method against the supplied target object with no arguments. |
static java.lang.Object |
invokeMethod(java.lang.reflect.Method method,
java.lang.Object target,
java.lang.Object... args)
Invoke the specified
Method against the supplied target object with the
supplied arguments. |
static boolean |
isCglibRenamedMethod(java.lang.reflect.Method renamedMethod)
Determine whether the given method is a CGLIB 'renamed' method,
following the pattern "CGLIB$methodName$0".
|
static boolean |
isEqualsMethod(java.lang.reflect.Method method)
Determine whether the given method is an "equals" method.
|
static boolean |
isHashCodeMethod(java.lang.reflect.Method method)
Determine whether the given method is a "hashCode" method.
|
static boolean |
isObjectMethod(java.lang.reflect.Method method)
Determine whether the given method is originally declared by
Object . |
static boolean |
isPublicStaticFinal(java.lang.reflect.Field field)
Determine whether the given field is a "public static final" constant.
|
static boolean |
isToStringMethod(java.lang.reflect.Method method)
Determine whether the given method is a "toString" method.
|
static void |
makeAccessible(java.lang.reflect.Constructor<?> ctor)
Make the given constructor accessible, explicitly setting it accessible
if necessary.
|
static void |
makeAccessible(java.lang.reflect.Field field)
Make the given field accessible, explicitly setting it accessible if
necessary.
|
static void |
makeAccessible(java.lang.reflect.Method method)
Make the given method accessible, explicitly setting it accessible if
necessary.
|
static void |
rethrowException(java.lang.Throwable ex)
Rethrow the given
exception , which is presumably the
target exception of an InvocationTargetException . |
static void |
rethrowRuntimeException(java.lang.Throwable ex)
Rethrow the given
exception , which is presumably the
target exception of an InvocationTargetException . |
static void |
setField(java.lang.reflect.Field field,
java.lang.Object target,
java.lang.Object value)
Set the field represented by the supplied
field object on the
specified target object to the specified value . |
static void |
shallowCopyFieldState(java.lang.Object src,
java.lang.Object dest)
Given the source object and the destination, which must be the same class
or a subclass, copy all fields, including inherited fields.
|
public static final ReflectionUtils.MethodFilter USER_DECLARED_METHODS
java.lang.Object
.public static final ReflectionUtils.FieldFilter COPYABLE_FIELDS
private static final java.lang.String CGLIB_RENAMED_METHOD_PREFIX
private static final java.lang.Class<?>[] EMPTY_CLASS_ARRAY
private static final java.lang.reflect.Method[] EMPTY_METHOD_ARRAY
private static final java.lang.reflect.Field[] EMPTY_FIELD_ARRAY
private static final java.lang.Object[] EMPTY_OBJECT_ARRAY
private static final java.util.Map<java.lang.Class<?>,java.lang.reflect.Method[]> declaredMethodsCache
Class.getDeclaredMethods()
plus equivalent default methods
from Java 8 based interfaces, allowing for fast iteration.private static final java.util.Map<java.lang.Class<?>,java.lang.reflect.Field[]> declaredFieldsCache
Class.getDeclaredFields()
, allowing for fast iteration.public static void handleReflectionException(java.lang.Exception ex)
Throws the underlying RuntimeException or Error in case of an InvocationTargetException with such a root cause. Throws an IllegalStateException with an appropriate message or UndeclaredThrowableException otherwise.
ex
- the reflection exception to handlepublic static void handleInvocationTargetException(java.lang.reflect.InvocationTargetException ex)
Throws the underlying RuntimeException or Error in case of such a root cause. Throws an UndeclaredThrowableException otherwise.
ex
- the invocation target exception to handlepublic static void rethrowRuntimeException(java.lang.Throwable ex)
exception
, which is presumably the
target exception of an InvocationTargetException
.
Should only be called if no checked exception is expected to be thrown
by the target method.
Rethrows the underlying exception cast to a RuntimeException
or
Error
if appropriate; otherwise, throws an
UndeclaredThrowableException
.
ex
- the exception to rethrowjava.lang.RuntimeException
- the rethrown exceptionpublic static void rethrowException(java.lang.Throwable ex) throws java.lang.Exception
exception
, which is presumably the
target exception of an InvocationTargetException
.
Should only be called if no checked exception is expected to be thrown
by the target method.
Rethrows the underlying exception cast to an Exception
or
Error
if appropriate; otherwise, throws an
UndeclaredThrowableException
.
ex
- the exception to rethrowjava.lang.Exception
- the rethrown exception (in case of a checked exception)public static <T> java.lang.reflect.Constructor<T> accessibleConstructor(java.lang.Class<T> clazz, java.lang.Class<?>... parameterTypes) throws java.lang.NoSuchMethodException
clazz
- the clazz to checkparameterTypes
- the parameter types of the desired constructorjava.lang.NoSuchMethodException
- if no such constructor existspublic static void makeAccessible(java.lang.reflect.Constructor<?> ctor)
setAccessible(true)
method is only called
when actually necessary, to avoid unnecessary conflicts with a JVM
SecurityManager (if active).ctor
- the constructor to make accessibleAccessibleObject.setAccessible(java.lang.reflect.AccessibleObject[], boolean)
@Nullable public static java.lang.reflect.Method findMethod(java.lang.Class<?> clazz, java.lang.String name)
Method
on the supplied class with the supplied name
and no parameters. Searches all superclasses up to Object
.
Returns null
if no Method
can be found.
clazz
- the class to introspectname
- the name of the methodnull
if none found@Nullable public static java.lang.reflect.Method findMethod(java.lang.Class<?> clazz, java.lang.String name, @Nullable java.lang.Class<?>... paramTypes)
Method
on the supplied class with the supplied name
and parameter types. Searches all superclasses up to Object
.
Returns null
if no Method
can be found.
clazz
- the class to introspectname
- the name of the methodparamTypes
- the parameter types of the method
(may be null
to indicate any signature)null
if none found@Nullable public static java.lang.Object invokeMethod(java.lang.reflect.Method method, @Nullable java.lang.Object target)
Method
against the supplied target object with no arguments.
The target object can be null
when invoking a static Method
.
Thrown exceptions are handled via a call to handleReflectionException(java.lang.Exception)
.
method
- the method to invoketarget
- the target object to invoke the method oninvokeMethod(java.lang.reflect.Method, Object, Object[])
@Nullable public static java.lang.Object invokeMethod(java.lang.reflect.Method method, @Nullable java.lang.Object target, @Nullable java.lang.Object... args)
Method
against the supplied target object with the
supplied arguments. The target object can be null
when invoking a
static Method
.
Thrown exceptions are handled via a call to handleReflectionException(java.lang.Exception)
.
method
- the method to invoketarget
- the target object to invoke the method onargs
- the invocation arguments (may be null
)public static boolean declaresException(java.lang.reflect.Method method, java.lang.Class<?> exceptionType)
method
- the declaring methodexceptionType
- the exception to throwtrue
if the exception can be thrown as-is;
false
if it needs to be wrappedpublic static void doWithLocalMethods(java.lang.Class<?> clazz, ReflectionUtils.MethodCallback mc)
clazz
- the class to introspectmc
- the callback to invoke for each methodjava.lang.IllegalStateException
- if introspection failsdoWithMethods(java.lang.Class<?>, org.springframework.util.ReflectionUtils.MethodCallback)
public static void doWithMethods(java.lang.Class<?> clazz, ReflectionUtils.MethodCallback mc)
The same named method occurring on subclass and superclass will appear
twice, unless excluded by a ReflectionUtils.MethodFilter
.
clazz
- the class to introspectmc
- the callback to invoke for each methodjava.lang.IllegalStateException
- if introspection failsdoWithMethods(Class, MethodCallback, MethodFilter)
public static void doWithMethods(java.lang.Class<?> clazz, ReflectionUtils.MethodCallback mc, @Nullable ReflectionUtils.MethodFilter mf)
The same named method occurring on subclass and superclass will appear
twice, unless excluded by the specified ReflectionUtils.MethodFilter
.
clazz
- the class to introspectmc
- the callback to invoke for each methodmf
- the filter that determines the methods to apply the callback tojava.lang.IllegalStateException
- if introspection failspublic static java.lang.reflect.Method[] getAllDeclaredMethods(java.lang.Class<?> leafClass)
leafClass
- the class to introspectjava.lang.IllegalStateException
- if introspection failspublic static java.lang.reflect.Method[] getUniqueDeclaredMethods(java.lang.Class<?> leafClass)
leafClass
- the class to introspectjava.lang.IllegalStateException
- if introspection failspublic static java.lang.reflect.Method[] getUniqueDeclaredMethods(java.lang.Class<?> leafClass, @Nullable ReflectionUtils.MethodFilter mf)
leafClass
- the class to introspectmf
- the filter that determines the methods to take into accountjava.lang.IllegalStateException
- if introspection failspublic static java.lang.reflect.Method[] getDeclaredMethods(java.lang.Class<?> clazz)
Class.getDeclaredMethods()
that uses a local cache in
order to avoid the JVM's SecurityManager check and new Method instances.
In addition, it also includes Java 8 default methods from locally
implemented interfaces, since those are effectively to be treated just
like declared methods.clazz
- the class to introspectjava.lang.IllegalStateException
- if introspection failsClass.getDeclaredMethods()
private static java.lang.reflect.Method[] getDeclaredMethods(java.lang.Class<?> clazz, boolean defensive)
@Nullable private static java.util.List<java.lang.reflect.Method> findConcreteMethodsOnInterfaces(java.lang.Class<?> clazz)
public static boolean isEqualsMethod(@Nullable java.lang.reflect.Method method)
Object.equals(Object)
public static boolean isHashCodeMethod(@Nullable java.lang.reflect.Method method)
Object.hashCode()
public static boolean isToStringMethod(@Nullable java.lang.reflect.Method method)
Object.toString()
public static boolean isObjectMethod(@Nullable java.lang.reflect.Method method)
Object
.public static boolean isCglibRenamedMethod(java.lang.reflect.Method renamedMethod)
renamedMethod
- the method to checkpublic static void makeAccessible(java.lang.reflect.Method method)
setAccessible(true)
method is only called
when actually necessary, to avoid unnecessary conflicts with a JVM
SecurityManager (if active).method
- the method to make accessibleAccessibleObject.setAccessible(java.lang.reflect.AccessibleObject[], boolean)
@Nullable public static java.lang.reflect.Field findField(java.lang.Class<?> clazz, java.lang.String name)
field
on the supplied Class
with the
supplied name
. Searches all superclasses up to Object
.clazz
- the class to introspectname
- the name of the fieldnull
if not found@Nullable public static java.lang.reflect.Field findField(java.lang.Class<?> clazz, @Nullable java.lang.String name, @Nullable java.lang.Class<?> type)
field
on the supplied Class
with the
supplied name
and/or type
. Searches all superclasses
up to Object
.clazz
- the class to introspectname
- the name of the field (may be null
if type is specified)type
- the type of the field (may be null
if name is specified)null
if not foundpublic static void setField(java.lang.reflect.Field field, @Nullable java.lang.Object target, @Nullable java.lang.Object value)
field object
on the
specified target object
to the specified value
.
In accordance with Field.set(Object, Object)
semantics, the new value
is automatically unwrapped if the underlying field has a primitive type.
Thrown exceptions are handled via a call to handleReflectionException(Exception)
.
field
- the field to settarget
- the target object on which to set the fieldvalue
- the value to set (may be null
)@Nullable public static java.lang.Object getField(java.lang.reflect.Field field, @Nullable java.lang.Object target)
field object
on the
specified target object
. In accordance with Field.get(Object)
semantics, the returned value is automatically wrapped if the underlying field
has a primitive type.
Thrown exceptions are handled via a call to handleReflectionException(Exception)
.
field
- the field to gettarget
- the target object from which to get the fieldpublic static void doWithLocalFields(java.lang.Class<?> clazz, ReflectionUtils.FieldCallback fc)
clazz
- the target class to analyzefc
- the callback to invoke for each fieldjava.lang.IllegalStateException
- if introspection failsdoWithFields(java.lang.Class<?>, org.springframework.util.ReflectionUtils.FieldCallback)
public static void doWithFields(java.lang.Class<?> clazz, ReflectionUtils.FieldCallback fc)
clazz
- the target class to analyzefc
- the callback to invoke for each fieldjava.lang.IllegalStateException
- if introspection failspublic static void doWithFields(java.lang.Class<?> clazz, ReflectionUtils.FieldCallback fc, @Nullable ReflectionUtils.FieldFilter ff)
clazz
- the target class to analyzefc
- the callback to invoke for each fieldff
- the filter that determines the fields to apply the callback tojava.lang.IllegalStateException
- if introspection failsprivate static java.lang.reflect.Field[] getDeclaredFields(java.lang.Class<?> clazz)
Class.getDeclaredFields()
from a local cache
in order to avoid the JVM's SecurityManager check and defensive array copying.clazz
- the class to introspectjava.lang.IllegalStateException
- if introspection failsClass.getDeclaredFields()
public static void shallowCopyFieldState(java.lang.Object src, java.lang.Object dest)
java.lang.IllegalStateException
- if introspection failspublic static boolean isPublicStaticFinal(java.lang.reflect.Field field)
field
- the field to checkpublic static void makeAccessible(java.lang.reflect.Field field)
setAccessible(true)
method is only called
when actually necessary, to avoid unnecessary conflicts with a JVM
SecurityManager (if active).field
- the field to make accessibleAccessibleObject.setAccessible(java.lang.reflect.AccessibleObject[], boolean)
public static void clearCache()