Package org.miaixz.bus.core.xyz
Class MethodKit
java.lang.Object
org.miaixz.bus.core.xyz.MethodKit
反射中
Method相关工具类,包括方法获取和方法执行- Since:
- Java 17+
- Author:
- Kimi Liu
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic Object[]actualArgs(Method method, Object[] args) 检查用户传入参数: 1、忽略多余的参数 2、参数不够补齐默认值 3、通过NullWrapperBean传递的参数,会直接赋值null 4、传入参数为null,但是目标参数类型为原始类型,做转换 5、传入参数类型不对应,尝试转换类型static Method[]getDeclaredMethods(Class<?> clazz) 获得类中所有直接声明方法,不包括其父类中的方法static Method[]getDeclaredMethods(Class<?> clazz, Predicate<Method> predicate) 获得类中所有直接声明方法,不包括其父类中的方法static Method查找指定方法 如果找不到对应的方法则返回null此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null。 如果查找的方法有多个同参数类型重载,查找第一个找到的方法static Method查找指定方法 如果找不到对应的方法则返回nullstatic Method查找指定方法 如果找不到对应的方法则返回null此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null。 如果查找的方法有多个同参数类型重载,查找最后一个非协变桥接方法static Method通过给定的条件(Predicate)从一个Method数组中查找第一个匹配的方法。static MethodgetMethodByName(Class<?> clazz, boolean ignoreCase, String methodName) 按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回nullstatic MethodgetMethodByName(Class<?> clazz, String methodName) 按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回nullstatic MethodgetMethodByNameIgnoreCase(Class<?> clazz, String methodName) 按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回nullstatic MethodgetMethodIgnoreCase(Class<?> clazz, String methodName, Class<?>... paramTypes) 忽略大小写查找指定方法,如果找不到对应的方法则返回nullgetMethodNames(Class<?> clazz) 获得指定类中的Public方法名 去重重载的方法static MethodgetMethodOfObject(Object obj, String methodName, Object... args) 查找指定对象中的所有方法(包括非public方法),也包括父对象和Object类的方法static Method[]getMethods(Class<?> clazz) 获得一个类中所有方法列表,包括其父类中的方法static Method[]getMethods(Class<?> clazz, Predicate<Method> predicate) 获得一个类中所有方法列表,包括其父类中的方法static Method[]getMethodsDirectly(Class<?> beanClass, boolean withSupers, boolean withMethodFromObject) 获得一个类中所有方法列表,直接反射获取,无缓存 接口获取方法和默认方法,获取的方法包括: 本类中的所有方法(包括static方法) 父类中的所有方法(包括static方法) Object中(包括static方法)static MethodgetPublicMethod(Class<?> clazz, boolean ignoreCase, String methodName, Class<?>... paramTypes) 查找指定Public方法 如果找不到对应的方法或方法不为public的则返回nullgetPublicMethodNames(Class<?> clazz) 获得指定类本类及其父类中的Public方法名 去重重载的方法static Method[]getPublicMethods(Class<?> clazz) 获得本类及其父类所有Public方法static Method[]getPublicMethods(Class<?> clazz, Predicate<Method> predicate) 获得本类及其父类所有Public方法static <T> T执行方法static <T> T执行对象中指定方法 如果需要传递的参数为null,请使用NullWrapperBean来传递,不然会丢失类型信息static <T> T执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法static <T> T执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法 非单例模式,如果是非静态方法,每次创建一个新对象static <T> T执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法static <T> T执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法 非单例模式,如果是非静态方法,每次创建一个新对象static ObjectinvokeGetter(Object object, String name) 调用Getter方法.static voidinvokeSetter(Object object, String name, Object value) 调用Setter方法, 仅匹配方法名 支持多级,如:对象名.对象名.方法static <T> TinvokeStatic(Method method, Object... args) 执行静态方法static <T> TinvokeWithCheck(Object obj, Method method, Object... args) 执行方法 执行前要检查给定参数:static booleanisEmptyParam(Method method) 是否为无参数方法static booleanisEqualsMethod(Method method) 是否为equals方法static boolean检查给定方法是否为Getter方法,规则为: 方法参数必须为0个 方法名称不能是getClass "is"开头返回必须为boolean或Boolean 是否以“get”static booleanisGetterOrSetter(Method method, boolean ignoreCase) 检查给定方法是否为Getter或者Setter方法,规则为: 方法参数必须为0个或1个 方法名称不能是getClass 如果是无参方法,则判断是否以“get”或“is”开头 如果方法参数1个,则判断是否以“set”开头static booleanisGetterOrSetterIgnoreCase(Method method) 检查给定方法是否为Getter或者Setter方法,规则为: 方法参数必须为0个或1个 如果是无参方法,则判断是否以“get”或“is”开头 如果方法参数1个,则判断是否以“set”开头static booleanisHashCodeMethod(Method method) 是否为hashCode方法static boolean检查给定方法是否为Setter方法,规则为: 方法参数必须为1个 判断是否以“set”开头static booleanisToStringMethod(Method method) 是否为toString方法static booleanisUserLevelMethod(Method method) static MethodTypemethodType(Executable executable) 获取指定Executable的MethodType此方法主要是读取方法或构造中的方法列表,主要为: 方法:[返回类型, 参数1类型, 参数2类型, ...] 构造:[构造对应类类型, 参数1类型, 参数2类型, ...]
-
Constructor Details
-
MethodKit
public MethodKit()
-
-
Method Details
-
getMethod
通过给定的条件(Predicate)从一个Method数组中查找第一个匹配的方法。- Parameters:
methods- Method数组,是被搜索的目标对象。predicate- 一个Predicate接口实例,用于定义查找方法的条件。- Returns:
- 返回第一个满足predicate条件的Method对象,如果没有找到匹配的方法则返回null。
-
getPublicMethodNames
获得指定类本类及其父类中的Public方法名 去重重载的方法- Parameters:
clazz- 类- Returns:
- 方法名Set
-
getPublicMethod
public static Method getPublicMethod(Class<?> clazz, boolean ignoreCase, String methodName, Class<?>... paramTypes) throws SecurityException 查找指定Public方法 如果找不到对应的方法或方法不为public的则返回null- Parameters:
clazz- 类ignoreCase- 是否忽略大小写methodName- 方法名paramTypes- 参数类型- Returns:
- 方法
- Throws:
SecurityException- 无权访问抛出异常
-
getMethodOfObject
public static Method getMethodOfObject(Object obj, String methodName, Object... args) throws SecurityException 查找指定对象中的所有方法(包括非public方法),也包括父对象和Object类的方法此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回
null。- Parameters:
obj- 被查找的对象,如果为null返回nullmethodName- 方法名,如果为空字符串返回nullargs- 参数- Returns:
- 方法
- Throws:
SecurityException- 无访问权限抛出异常
-
getMethodIgnoreCase
public static Method getMethodIgnoreCase(Class<?> clazz, String methodName, Class<?>... paramTypes) throws SecurityException 忽略大小写查找指定方法,如果找不到对应的方法则返回null此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回
null。- Parameters:
clazz- 类,如果为null返回nullmethodName- 方法名,如果为空字符串返回nullparamTypes- 参数类型,指定参数类型如果是方法的子类也算- Returns:
- 方法
- Throws:
SecurityException- 无权访问抛出异常
-
getMethod
public static Method getMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) throws SecurityException 查找指定方法 如果找不到对应的方法则返回null此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回
null。- Parameters:
clazz- 类,如果为null返回nullmethodName- 方法名,如果为空字符串返回nullparamTypes- 参数类型,指定参数类型如果是方法的子类也算- Returns:
- 方法
- Throws:
SecurityException- 无权访问抛出异常
-
getMethod
public static Method getMethod(Class<?> clazz, boolean ignoreCase, String methodName, Class<?>... paramTypes) throws SecurityException 查找指定方法 如果找不到对应的方法则返回null此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null。 如果查找的方法有多个同参数类型重载,查找第一个找到的方法- Parameters:
clazz- 类,如果为null返回nullignoreCase- 是否忽略大小写methodName- 方法名,如果为空字符串返回nullparamTypes- 参数类型,指定参数类型如果是方法的子类也算- Returns:
- 方法
- Throws:
SecurityException- 无权访问抛出异常
-
getMethod
public static Method getMethod(Method[] methods, boolean ignoreCase, String methodName, Class<?>... paramTypes) throws SecurityException 查找指定方法 如果找不到对应的方法则返回null此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null。 如果查找的方法有多个同参数类型重载,查找最后一个非协变桥接方法- Parameters:
methods- 方法列表ignoreCase- 是否忽略大小写methodName- 方法名,如果为空字符串返回nullparamTypes- 参数类型,指定参数类型如果是方法的子类也算- Returns:
- 方法
- Throws:
SecurityException- 无权访问抛出异常
-
getMethodByName
按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回null此方法只检查方法名是否一致,并不检查参数的一致性。
- Parameters:
clazz- 类,如果为null返回nullmethodName- 方法名,如果为空字符串返回null- Returns:
- 方法
- Throws:
SecurityException- 无权访问抛出异常
-
getMethodByNameIgnoreCase
public static Method getMethodByNameIgnoreCase(Class<?> clazz, String methodName) throws SecurityException 按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回null此方法只检查方法名是否一致(忽略大小写),并不检查参数的一致性。
- Parameters:
clazz- 类,如果为null返回nullmethodName- 方法名,如果为空字符串返回null- Returns:
- 方法
- Throws:
SecurityException- 无权访问抛出异常
-
getMethodByName
public static Method getMethodByName(Class<?> clazz, boolean ignoreCase, String methodName) throws SecurityException 按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回null此方法只检查方法名是否一致,并不检查参数的一致性。
- Parameters:
clazz- 类,如果为null返回nullignoreCase- 是否忽略大小写methodName- 方法名,如果为空字符串返回null- Returns:
- 方法
- Throws:
SecurityException- 无权访问抛出异常
-
getMethodNames
获得指定类中的Public方法名 去重重载的方法- Parameters:
clazz- 类- Returns:
- 方法名Set
- Throws:
SecurityException- 安全异常
-
getMethods
获得一个类中所有方法列表,包括其父类中的方法- Parameters:
clazz- 类,非null- Returns:
- 方法列表
- Throws:
SecurityException- 安全检查异常
-
getMethods
public static Method[] getMethods(Class<?> clazz, Predicate<Method> predicate) throws SecurityException 获得一个类中所有方法列表,包括其父类中的方法- Parameters:
clazz- 类,非nullpredicate- 方法过滤器,null表示无过滤- Returns:
- 方法列表
- Throws:
SecurityException- 安全检查异常
-
getPublicMethods
获得本类及其父类所有Public方法- Parameters:
clazz- 查找方法的类- Returns:
- 过滤后的方法列表
-
getPublicMethods
获得本类及其父类所有Public方法- Parameters:
clazz- 查找方法的类predicate- 方法过滤器,null表示无过滤- Returns:
- 过滤后的方法列表
-
getDeclaredMethods
获得类中所有直接声明方法,不包括其父类中的方法- Parameters:
clazz- 类,非null- Returns:
- 方法列表
- Throws:
SecurityException- 安全检查异常
-
getDeclaredMethods
public static Method[] getDeclaredMethods(Class<?> clazz, Predicate<Method> predicate) throws SecurityException 获得类中所有直接声明方法,不包括其父类中的方法- Parameters:
clazz- 类,非nullpredicate- 方法过滤器,null表示无过滤- Returns:
- 方法列表
- Throws:
SecurityException- 安全检查异常
-
getMethodsDirectly
public static Method[] getMethodsDirectly(Class<?> beanClass, boolean withSupers, boolean withMethodFromObject) throws SecurityException 获得一个类中所有方法列表,直接反射获取,无缓存 接口获取方法和默认方法,获取的方法包括:- 本类中的所有方法(包括static方法)
- 父类中的所有方法(包括static方法)
- Object中(包括static方法)
- Parameters:
beanClass- 类或接口withSupers- 是否包括父类或接口的方法列表withMethodFromObject- 是否包括Object中的方法- Returns:
- 方法列表
- Throws:
SecurityException- 安全检查异常
-
isEqualsMethod
是否为equals方法- Parameters:
method- 方法- Returns:
- 是否为equals方法
-
isHashCodeMethod
是否为hashCode方法- Parameters:
method- 方法- Returns:
- 是否为hashCode方法
-
isToStringMethod
是否为toString方法- Parameters:
method- 方法- Returns:
- 是否为toString方法
-
isEmptyParam
是否为无参数方法- Parameters:
method- 方法- Returns:
- 是否为无参数方法
-
isGetterOrSetterIgnoreCase
检查给定方法是否为Getter或者Setter方法,规则为:- 方法参数必须为0个或1个
- 如果是无参方法,则判断是否以“get”或“is”开头
- 如果方法参数1个,则判断是否以“set”开头
- Parameters:
method- 方法- Returns:
- 是否为Getter或者Setter方法
-
isGetterOrSetter
检查给定方法是否为Getter或者Setter方法,规则为:- 方法参数必须为0个或1个
- 方法名称不能是getClass
- 如果是无参方法,则判断是否以“get”或“is”开头
- 如果方法参数1个,则判断是否以“set”开头
- Parameters:
method- 方法ignoreCase- 是否忽略方法名的大小写- Returns:
- 是否为Getter或者Setter方法
-
isSetter
检查给定方法是否为Setter方法,规则为:- 方法参数必须为1个
- 判断是否以“set”开头
- Parameters:
method- 方法ignoreCase- 是否忽略方法名的大小写- Returns:
- 是否为Setter方法
-
isGetter
检查给定方法是否为Getter方法,规则为:- 方法参数必须为0个
- 方法名称不能是getClass
- "is"开头返回必须为boolean或Boolean
- 是否以“get”
- Parameters:
method- 方法ignoreCase- 是否忽略方法名的大小写- Returns:
- 是否为Getter方法
-
invokeStatic
执行静态方法- Type Parameters:
T- 对象类型- Parameters:
method- 方法(对象方法或static方法都可)args- 参数对象- Returns:
- 结果
- Throws:
InternalException- 多种异常包装
-
invokeWithCheck
public static <T> T invokeWithCheck(Object obj, Method method, Object... args) throws InternalException 执行方法 执行前要检查给定参数:1. 参数个数是否与方法参数个数一致 2. 如果某个参数为null但是方法这个位置的参数为原始类型,则赋予原始类型默认值
- Type Parameters:
T- 返回对象类型- Parameters:
obj- 对象,如果执行静态方法,此值为nullmethod- 方法(对象方法或static方法都可)args- 参数对象- Returns:
- 结果
- Throws:
InternalException- 一些列异常的包装
-
invoke
执行方法对于用户传入参数会做必要检查,包括:
1、忽略多余的参数 2、参数不够补齐默认值 3、传入参数为null,但是目标参数类型为原始类型,做转换- Type Parameters:
T- 返回对象类型- Parameters:
obj- 对象,如果执行静态方法,此值为nullmethod- 方法(对象方法或static方法都可)args- 参数对象- Returns:
- 结果
- Throws:
InternalException- 一些列异常的包装- See Also:
-
invoke
执行对象中指定方法 如果需要传递的参数为null,请使用NullWrapperBean来传递,不然会丢失类型信息- Type Parameters:
T- 返回对象类型- Parameters:
obj- 方法所在对象methodName- 方法名args- 参数列表- Returns:
- 执行结果
- Throws:
InternalException- IllegalAccessException包装- See Also:
-
invoke
执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法 非单例模式,如果是非静态方法,每次创建一个新对象- Type Parameters:
T- 对象类型- Parameters:
classNameWithMethodName- 类名和方法名表达式args- 参数,必须严格对应指定方法的参数类型和数量- Returns:
- 返回结果
-
invoke
执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法- Type Parameters:
T- 对象类型- Parameters:
classNameWithMethodName- 类名和方法名表达式isSingleton- 是否为单例对象,如果此参数为false,每次执行方法时创建一个新对象args- 参数,必须严格对应指定方法的参数类型和数量- Returns:
- 返回结果
-
invoke
执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法 非单例模式,如果是非静态方法,每次创建一个新对象- Type Parameters:
T- 对象类型- Parameters:
className- 类名,完整类路径methodName- 方法名args- 参数,必须严格对应指定方法的参数类型和数量- Returns:
- 返回结果
-
invoke
public static <T> T invoke(String className, String methodName, boolean isSingleton, Object... args) 执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法- Type Parameters:
T- 对象类型- Parameters:
className- 类名,完整类路径methodName- 方法名isSingleton- 是否为单例对象,如果此参数为false,每次执行方法时创建一个新对象args- 参数,必须严格对应指定方法的参数类型和数量- Returns:
- 返回结果
-
invokeGetter
调用Getter方法. 支持多级,如:对象名.对象名.方法- Parameters:
object- 对象name- 属性名- Returns:
- the object
-
invokeSetter
调用Setter方法, 仅匹配方法名 支持多级,如:对象名.对象名.方法- Parameters:
object- 对象name- 属性名value- 值
-
actualArgs
检查用户传入参数:- 1、忽略多余的参数
- 2、参数不够补齐默认值
- 3、通过NullWrapperBean传递的参数,会直接赋值null
- 4、传入参数为null,但是目标参数类型为原始类型,做转换
- 5、传入参数类型不对应,尝试转换类型
- Parameters:
method- 方法args- 参数- Returns:
- 实际的参数数组
-
methodType
获取指定Executable的MethodType此方法主要是读取方法或构造中的方法列表,主要为:- 方法:[返回类型, 参数1类型, 参数2类型, ...]
- 构造:[构造对应类类型, 参数1类型, 参数2类型, ...]
- Parameters:
executable- 方法或构造- Returns:
MethodType
-
isUserLevelMethod
-