public abstract class ReflectionUtils extends 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 |
---|---|
static ReflectionUtils.FieldFilter |
COPYABLE_FIELDS
Pre-built FieldFilter that matches all non-static, non-final fields.
|
static ReflectionUtils.MethodFilter |
USER_DECLARED_METHODS
Pre-built
ReflectionUtils.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> Constructor<T> |
accessibleConstructor(Class<T> clazz,
Class<?>... parameterTypes)
Obtain an accessible constructor for the given class and parameters.
|
static void |
clearCache()
Clear the internal method/field cache.
|
static boolean |
declaresException(Method method,
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(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(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(Class<?> clazz,
ReflectionUtils.FieldCallback fc)
Invoke the given callback on all locally declared fields in the given class.
|
static void |
doWithLocalMethods(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(Class<?> clazz,
ReflectionUtils.MethodCallback mc)
Perform the given callback operation on all matching methods of the given
class and superclasses.
|
static void |
doWithMethods(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).
|
static Field |
findField(Class<?> clazz,
String name)
|
static Field |
findField(Class<?> clazz,
String name,
Class<?> type)
|
static Method |
findMethod(Class<?> clazz,
String name)
Attempt to find a
Method on the supplied class with the supplied name
and no parameters. |
static Method |
findMethod(Class<?> clazz,
String name,
Class<?>... paramTypes)
Attempt to find a
Method on the supplied class with the supplied name
and parameter types. |
static Method[] |
getAllDeclaredMethods(Class<?> leafClass)
Get all declared methods on the leaf class and all superclasses.
|
static Method[] |
getDeclaredMethods(Class<?> clazz)
Variant of
Class.getDeclaredMethods() that uses a local cache in
order to avoid the JVM's SecurityManager check and new Method instances. |
static Object |
getField(Field field,
Object target)
Get the field represented by the supplied
field object on the
specified target object . |
static Method[] |
getUniqueDeclaredMethods(Class<?> leafClass)
Get the unique set of declared methods on the leaf class and all superclasses.
|
static Method[] |
getUniqueDeclaredMethods(Class<?> leafClass,
ReflectionUtils.MethodFilter mf)
Get the unique set of declared methods on the leaf class and all superclasses.
|
static void |
handleInvocationTargetException(InvocationTargetException ex)
Handle the given invocation target exception.
|
static void |
handleReflectionException(Exception ex)
Handle the given reflection exception.
|
static Object |
invokeMethod(Method method,
Object target)
Invoke the specified
Method against the supplied target object with no arguments. |
static Object |
invokeMethod(Method method,
Object target,
Object... args)
Invoke the specified
Method against the supplied target object with the
supplied arguments. |
static boolean |
isCglibRenamedMethod(Method renamedMethod)
Determine whether the given method is a CGLIB 'renamed' method,
following the pattern "CGLIB$methodName$0".
|
static boolean |
isEqualsMethod(Method method)
Determine whether the given method is an "equals" method.
|
static boolean |
isHashCodeMethod(Method method)
Determine whether the given method is a "hashCode" method.
|
static boolean |
isObjectMethod(Method method)
Determine whether the given method is originally declared by
Object . |
static boolean |
isPublicStaticFinal(Field field)
Determine whether the given field is a "public static final" constant.
|
static boolean |
isToStringMethod(Method method)
Determine whether the given method is a "toString" method.
|
static void |
makeAccessible(Constructor<?> ctor)
Make the given constructor accessible, explicitly setting it accessible
if necessary.
|
static void |
makeAccessible(Field field)
Make the given field accessible, explicitly setting it accessible if
necessary.
|
static void |
makeAccessible(Method method)
Make the given method accessible, explicitly setting it accessible if
necessary.
|
static void |
rethrowException(Throwable ex)
Rethrow the given
exception , which is presumably the
target exception of an InvocationTargetException . |
static void |
rethrowRuntimeException(Throwable ex)
Rethrow the given
exception , which is presumably the
target exception of an InvocationTargetException . |
static void |
setField(Field field,
Object target,
Object value)
Set the field represented by the supplied field object on
the specified target object to the specified
value . |
static void |
shallowCopyFieldState(Object src,
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
ReflectionUtils.MethodFilter
that matches all non-bridge non-synthetic methods
which are not declared on java.lang.Object
.public static final ReflectionUtils.FieldFilter COPYABLE_FIELDS
public static void handleReflectionException(Exception ex)
Should only be called if no checked exception is expected to be thrown by a target method, or if an error occurs while accessing a method or field.
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(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(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 rethrowRuntimeException
- the rethrown exceptionpublic static void rethrowException(Throwable ex) throws 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 rethrowException
- the rethrown exception (in case of a checked exception)public static <T> Constructor<T> accessibleConstructor(Class<T> clazz, Class<?>... parameterTypes) throws NoSuchMethodException
clazz
- the clazz to checkparameterTypes
- the parameter types of the desired constructorNoSuchMethodException
- if no such constructor existspublic static void makeAccessible(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 Method findMethod(Class<?> clazz, 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 Method findMethod(Class<?> clazz, String name, @Nullable 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 Object invokeMethod(Method method, @Nullable 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 Object invokeMethod(Method method, @Nullable Object target, @Nullable 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(Method method, 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(Class<?> clazz, ReflectionUtils.MethodCallback mc)
clazz
- the class to introspectmc
- the callback to invoke for each methodIllegalStateException
- if introspection failsdoWithMethods(java.lang.Class<?>, org.springframework.util.ReflectionUtils.MethodCallback)
public static void doWithMethods(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 methodIllegalStateException
- if introspection failsdoWithMethods(Class, MethodCallback, MethodFilter)
public static void doWithMethods(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 toIllegalStateException
- if introspection failspublic static Method[] getAllDeclaredMethods(Class<?> leafClass)
leafClass
- the class to introspectIllegalStateException
- if introspection failspublic static Method[] getUniqueDeclaredMethods(Class<?> leafClass)
leafClass
- the class to introspectIllegalStateException
- if introspection failspublic static Method[] getUniqueDeclaredMethods(Class<?> leafClass, @Nullable ReflectionUtils.MethodFilter mf)
leafClass
- the class to introspectmf
- the filter that determines the methods to take into accountIllegalStateException
- if introspection failspublic static Method[] getDeclaredMethods(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 introspectIllegalStateException
- if introspection failsClass.getDeclaredMethods()
public static boolean isEqualsMethod(@Nullable Method method)
Object.equals(Object)
public static boolean isHashCodeMethod(@Nullable Method method)
Object.hashCode()
public static boolean isToStringMethod(@Nullable Method method)
Object.toString()
public static boolean isObjectMethod(@Nullable Method method)
Object
.public static boolean isCglibRenamedMethod(Method renamedMethod)
renamedMethod
- the method to checkpublic static void makeAccessible(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 Field findField(Class<?> clazz, 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 Field findField(Class<?> clazz, @Nullable String name, @Nullable 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(Field field, @Nullable Object target, @Nullable Object value)
value
.
In accordance with Field.set(Object, Object)
semantics, the new value
is automatically unwrapped if the underlying field has a primitive type.
This method does not support setting static final
fields.
Thrown exceptions are handled via a call to handleReflectionException(Exception)
.
field
- the field to settarget
- the target object on which to set the field
(or null
for a static field)value
- the value to set (may be null
)@Nullable public static Object getField(Field field, @Nullable 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 field
(or null
for a static field)public static void doWithLocalFields(Class<?> clazz, ReflectionUtils.FieldCallback fc)
clazz
- the target class to analyzefc
- the callback to invoke for each fieldIllegalStateException
- if introspection failsdoWithFields(java.lang.Class<?>, org.springframework.util.ReflectionUtils.FieldCallback)
public static void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc)
clazz
- the target class to analyzefc
- the callback to invoke for each fieldIllegalStateException
- if introspection failspublic static void doWithFields(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 toIllegalStateException
- if introspection failspublic static void shallowCopyFieldState(Object src, Object dest)
IllegalStateException
- if introspection failspublic static boolean isPublicStaticFinal(Field field)
field
- the field to checkpublic static void makeAccessible(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()