Class MethodKit

java.lang.Object
org.miaixz.bus.core.xyz.MethodKit

public class MethodKit extends Object
反射中Method相关工具类,包括方法获取和方法执行
Since:
Java 17+
Author:
Kimi Liu
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static Object[]
    actualArgs(Method method, Object[] args)
    检查用户传入参数: 1、忽略多余的参数 2、参数不够补齐默认值 3、通过NullWrapperBean传递的参数,会直接赋值null 4、传入参数为null,但是目标参数类型为原始类型,做转换 5、传入参数类型不对应,尝试转换类型
    static Method[]
    获得类中所有直接声明方法,不包括其父类中的方法
    static Method[]
    getDeclaredMethods(Class<?> clazz, Predicate<Method> predicate)
    获得类中所有直接声明方法,不包括其父类中的方法
    static Method
    getMethod(Class<?> clazz, boolean ignoreCase, String methodName, Class<?>... paramTypes)
    查找指定方法 如果找不到对应的方法则返回null 此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null。 如果查找的方法有多个同参数类型重载,查找第一个找到的方法
    static Method
    getMethod(Class<?> clazz, String methodName, Class<?>... paramTypes)
    查找指定方法 如果找不到对应的方法则返回null
    static Method
    getMethod(Method[] methods, boolean ignoreCase, String methodName, Class<?>... paramTypes)
    查找指定方法 如果找不到对应的方法则返回null
    此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null
    如果查找的方法有多个同参数类型重载,查找最后一个非协变桥接方法
    static Method
    getMethod(Method[] methods, Predicate<Method> predicate)
    通过给定的条件(Predicate)从一个Method数组中查找第一个匹配的方法。
    static Method
    getMethodByName(Class<?> clazz, boolean ignoreCase, String methodName)
    按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回null
    static Method
    getMethodByName(Class<?> clazz, String methodName)
    按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回null
    static Method
    getMethodByNameIgnoreCase(Class<?> clazz, String methodName)
    按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回null
    static Method
    getMethodIgnoreCase(Class<?> clazz, String methodName, Class<?>... paramTypes)
    忽略大小写查找指定方法,如果找不到对应的方法则返回null
    static Set<String>
    获得指定类中的Public方法名 去重重载的方法
    static Method
    getMethodOfObject(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 Method
    getPublicMethod(Class<?> clazz, boolean ignoreCase, String methodName, Class<?>... paramTypes)
    查找指定Public方法 如果找不到对应的方法或方法不为public的则返回null
    static Set<String>
    获得指定类本类及其父类中的Public方法名 去重重载的方法
    static Method[]
    获得本类及其父类所有Public方法
    static Method[]
    getPublicMethods(Class<?> clazz, Predicate<Method> predicate)
    获得本类及其父类所有Public方法
    static <T> T
    invoke(Object obj, Method method, Object... args)
    执行方法
    static <T> T
    invoke(Object obj, String methodName, Object... args)
    执行对象中指定方法 如果需要传递的参数为null,请使用NullWrapperBean来传递,不然会丢失类型信息
    static <T> T
    invoke(String classNameWithMethodName, boolean isSingleton, Object... args)
    执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法
    static <T> T
    invoke(String classNameWithMethodName, Object[] args)
    执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法 非单例模式,如果是非静态方法,每次创建一个新对象
    static <T> T
    invoke(String className, String methodName, boolean isSingleton, Object... args)
    执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法
    static <T> T
    invoke(String className, String methodName, Object[] args)
    执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法 非单例模式,如果是非静态方法,每次创建一个新对象
    static Object
    invokeGetter(Object object, String name)
    调用Getter方法.
    static void
    invokeSetter(Object object, String name, Object value)
    调用Setter方法, 仅匹配方法名 支持多级,如:对象名.对象名.方法
    static <T> T
    invokeStatic(Method method, Object... args)
    执行静态方法
    static <T> T
    invokeWithCheck(Object obj, Method method, Object... args)
    执行方法 执行前要检查给定参数:
    static boolean
    是否为无参数方法
    static boolean
    是否为equals方法
    static boolean
    isGetter(Method method, boolean ignoreCase)
    检查给定方法是否为Getter方法,规则为: 方法参数必须为0个 方法名称不能是getClass "is"开头返回必须为boolean或Boolean 是否以“get”
    static boolean
    isGetterOrSetter(Method method, boolean ignoreCase)
    检查给定方法是否为Getter或者Setter方法,规则为: 方法参数必须为0个或1个 方法名称不能是getClass 如果是无参方法,则判断是否以“get”或“is”开头 如果方法参数1个,则判断是否以“set”开头
    static boolean
    检查给定方法是否为Getter或者Setter方法,规则为: 方法参数必须为0个或1个 如果是无参方法,则判断是否以“get”或“is”开头 如果方法参数1个,则判断是否以“set”开头
    static boolean
    是否为hashCode方法
    static boolean
    isSetter(Method method, boolean ignoreCase)
    检查给定方法是否为Setter方法,规则为: 方法参数必须为1个 判断是否以“set”开头
    static boolean
    是否为toString方法
    static boolean
     
    static MethodType
    methodType(Executable executable)
    获取指定ExecutableMethodType 此方法主要是读取方法或构造中的方法列表,主要为: 方法:[返回类型, 参数1类型, 参数2类型, ...] 构造:[构造对应类类型, 参数1类型, 参数2类型, ...]

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • MethodKit

      public MethodKit()
  • Method Details

    • getMethod

      public static Method getMethod(Method[] methods, Predicate<Method> predicate)
      通过给定的条件(Predicate)从一个Method数组中查找第一个匹配的方法。
      Parameters:
      methods - Method数组,是被搜索的目标对象。
      predicate - 一个Predicate接口实例,用于定义查找方法的条件。
      Returns:
      返回第一个满足predicate条件的Method对象,如果没有找到匹配的方法则返回null。
    • getPublicMethodNames

      public static Set<String> getPublicMethodNames(Class<?> clazz)
      获得指定类本类及其父类中的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返回null
      methodName - 方法名,如果为空字符串返回null
      args - 参数
      Returns:
      方法
      Throws:
      SecurityException - 无访问权限抛出异常
    • getMethodIgnoreCase

      public static Method getMethodIgnoreCase(Class<?> clazz, String methodName, Class<?>... paramTypes) throws SecurityException
      忽略大小写查找指定方法,如果找不到对应的方法则返回null

      此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null

      Parameters:
      clazz - 类,如果为null返回null
      methodName - 方法名,如果为空字符串返回null
      paramTypes - 参数类型,指定参数类型如果是方法的子类也算
      Returns:
      方法
      Throws:
      SecurityException - 无权访问抛出异常
    • getMethod

      public static Method getMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) throws SecurityException
      查找指定方法 如果找不到对应的方法则返回null

      此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null

      Parameters:
      clazz - 类,如果为null返回null
      methodName - 方法名,如果为空字符串返回null
      paramTypes - 参数类型,指定参数类型如果是方法的子类也算
      Returns:
      方法
      Throws:
      SecurityException - 无权访问抛出异常
    • getMethod

      public static Method getMethod(Class<?> clazz, boolean ignoreCase, String methodName, Class<?>... paramTypes) throws SecurityException
      查找指定方法 如果找不到对应的方法则返回null 此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null。 如果查找的方法有多个同参数类型重载,查找第一个找到的方法
      Parameters:
      clazz - 类,如果为null返回null
      ignoreCase - 是否忽略大小写
      methodName - 方法名,如果为空字符串返回null
      paramTypes - 参数类型,指定参数类型如果是方法的子类也算
      Returns:
      方法
      Throws:
      SecurityException - 无权访问抛出异常
    • getMethod

      public static Method getMethod(Method[] methods, boolean ignoreCase, String methodName, Class<?>... paramTypes) throws SecurityException
      查找指定方法 如果找不到对应的方法则返回null
      此方法为精准获取方法名,即方法名和参数数量和类型必须一致,否则返回null
      如果查找的方法有多个同参数类型重载,查找最后一个非协变桥接方法
      Parameters:
      methods - 方法列表
      ignoreCase - 是否忽略大小写
      methodName - 方法名,如果为空字符串返回null
      paramTypes - 参数类型,指定参数类型如果是方法的子类也算
      Returns:
      方法
      Throws:
      SecurityException - 无权访问抛出异常
    • getMethodByName

      public static Method getMethodByName(Class<?> clazz, String methodName) throws SecurityException
      按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回null

      此方法只检查方法名是否一致,并不检查参数的一致性。

      Parameters:
      clazz - 类,如果为null返回null
      methodName - 方法名,如果为空字符串返回null
      Returns:
      方法
      Throws:
      SecurityException - 无权访问抛出异常
    • getMethodByNameIgnoreCase

      public static Method getMethodByNameIgnoreCase(Class<?> clazz, String methodName) throws SecurityException
      按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回null

      此方法只检查方法名是否一致(忽略大小写),并不检查参数的一致性。

      Parameters:
      clazz - 类,如果为null返回null
      methodName - 方法名,如果为空字符串返回null
      Returns:
      方法
      Throws:
      SecurityException - 无权访问抛出异常
    • getMethodByName

      public static Method getMethodByName(Class<?> clazz, boolean ignoreCase, String methodName) throws SecurityException
      按照方法名查找指定方法名的方法,只返回匹配到的第一个方法,如果找不到对应的方法则返回null

      此方法只检查方法名是否一致,并不检查参数的一致性。

      Parameters:
      clazz - 类,如果为null返回null
      ignoreCase - 是否忽略大小写
      methodName - 方法名,如果为空字符串返回null
      Returns:
      方法
      Throws:
      SecurityException - 无权访问抛出异常
    • getMethodNames

      public static Set<String> getMethodNames(Class<?> clazz) throws SecurityException
      获得指定类中的Public方法名 去重重载的方法
      Parameters:
      clazz - 类
      Returns:
      方法名Set
      Throws:
      SecurityException - 安全异常
    • getMethods

      public static Method[] getMethods(Class<?> clazz) throws SecurityException
      获得一个类中所有方法列表,包括其父类中的方法
      Parameters:
      clazz - 类,非null
      Returns:
      方法列表
      Throws:
      SecurityException - 安全检查异常
    • getMethods

      public static Method[] getMethods(Class<?> clazz, Predicate<Method> predicate) throws SecurityException
      获得一个类中所有方法列表,包括其父类中的方法
      Parameters:
      clazz - 类,非null
      predicate - 方法过滤器,null表示无过滤
      Returns:
      方法列表
      Throws:
      SecurityException - 安全检查异常
    • getPublicMethods

      public static Method[] getPublicMethods(Class<?> clazz)
      获得本类及其父类所有Public方法
      Parameters:
      clazz - 查找方法的类
      Returns:
      过滤后的方法列表
    • getPublicMethods

      public static Method[] getPublicMethods(Class<?> clazz, Predicate<Method> predicate)
      获得本类及其父类所有Public方法
      Parameters:
      clazz - 查找方法的类
      predicate - 方法过滤器,null表示无过滤
      Returns:
      过滤后的方法列表
    • getDeclaredMethods

      public static Method[] getDeclaredMethods(Class<?> clazz) throws SecurityException
      获得类中所有直接声明方法,不包括其父类中的方法
      Parameters:
      clazz - 类,非null
      Returns:
      方法列表
      Throws:
      SecurityException - 安全检查异常
    • getDeclaredMethods

      public static Method[] getDeclaredMethods(Class<?> clazz, Predicate<Method> predicate) throws SecurityException
      获得类中所有直接声明方法,不包括其父类中的方法
      Parameters:
      clazz - 类,非null
      predicate - 方法过滤器,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

      public static boolean isEqualsMethod(Method method)
      是否为equals方法
      Parameters:
      method - 方法
      Returns:
      是否为equals方法
    • isHashCodeMethod

      public static boolean isHashCodeMethod(Method method)
      是否为hashCode方法
      Parameters:
      method - 方法
      Returns:
      是否为hashCode方法
    • isToStringMethod

      public static boolean isToStringMethod(Method method)
      是否为toString方法
      Parameters:
      method - 方法
      Returns:
      是否为toString方法
    • isEmptyParam

      public static boolean isEmptyParam(Method method)
      是否为无参数方法
      Parameters:
      method - 方法
      Returns:
      是否为无参数方法
    • isGetterOrSetterIgnoreCase

      public static boolean isGetterOrSetterIgnoreCase(Method method)
      检查给定方法是否为Getter或者Setter方法,规则为:
      • 方法参数必须为0个或1个
      • 如果是无参方法,则判断是否以“get”或“is”开头
      • 如果方法参数1个,则判断是否以“set”开头
      Parameters:
      method - 方法
      Returns:
      是否为Getter或者Setter方法
    • isGetterOrSetter

      public static boolean isGetterOrSetter(Method method, boolean ignoreCase)
      检查给定方法是否为Getter或者Setter方法,规则为:
      • 方法参数必须为0个或1个
      • 方法名称不能是getClass
      • 如果是无参方法,则判断是否以“get”或“is”开头
      • 如果方法参数1个,则判断是否以“set”开头
      Parameters:
      method - 方法
      ignoreCase - 是否忽略方法名的大小写
      Returns:
      是否为Getter或者Setter方法
    • isSetter

      public static boolean isSetter(Method method, boolean ignoreCase)
      检查给定方法是否为Setter方法,规则为:
      • 方法参数必须为1个
      • 判断是否以“set”开头
      Parameters:
      method - 方法
      ignoreCase - 是否忽略方法名的大小写
      Returns:
      是否为Setter方法
    • isGetter

      public static boolean isGetter(Method method, boolean ignoreCase)
      检查给定方法是否为Getter方法,规则为:
      • 方法参数必须为0个
      • 方法名称不能是getClass
      • "is"开头返回必须为boolean或Boolean
      • 是否以“get”
      Parameters:
      method - 方法
      ignoreCase - 是否忽略方法名的大小写
      Returns:
      是否为Getter方法
    • invokeStatic

      public static <T> T invokeStatic(Method method, Object... args) throws InternalException
      执行静态方法
      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 - 对象,如果执行静态方法,此值为null
      method - 方法(对象方法或static方法都可)
      args - 参数对象
      Returns:
      结果
      Throws:
      InternalException - 一些列异常的包装
    • invoke

      public static <T> T invoke(Object obj, Method method, Object... args) throws InternalException
      执行方法

      对于用户传入参数会做必要检查,包括:

           1、忽略多余的参数
           2、参数不够补齐默认值
           3、传入参数为null,但是目标参数类型为原始类型,做转换
       
      Type Parameters:
      T - 返回对象类型
      Parameters:
      obj - 对象,如果执行静态方法,此值为null
      method - 方法(对象方法或static方法都可)
      args - 参数对象
      Returns:
      结果
      Throws:
      InternalException - 一些列异常的包装
      See Also:
    • invoke

      public static <T> T invoke(Object obj, String methodName, Object... args) throws InternalException
      执行对象中指定方法 如果需要传递的参数为null,请使用NullWrapperBean来传递,不然会丢失类型信息
      Type Parameters:
      T - 返回对象类型
      Parameters:
      obj - 方法所在对象
      methodName - 方法名
      args - 参数列表
      Returns:
      执行结果
      Throws:
      InternalException - IllegalAccessException包装
      See Also:
    • invoke

      public static <T> T invoke(String classNameWithMethodName, Object[] args)
      执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法 非单例模式,如果是非静态方法,每次创建一个新对象
      Type Parameters:
      T - 对象类型
      Parameters:
      classNameWithMethodName - 类名和方法名表达式
      args - 参数,必须严格对应指定方法的参数类型和数量
      Returns:
      返回结果
    • invoke

      public static <T> T invoke(String classNameWithMethodName, boolean isSingleton, Object... args)
      执行方法 可执行Private方法,也可执行static方法 执行非static方法时,必须满足对象有默认构造方法
      Type Parameters:
      T - 对象类型
      Parameters:
      classNameWithMethodName - 类名和方法名表达式
      isSingleton - 是否为单例对象,如果此参数为false,每次执行方法时创建一个新对象
      args - 参数,必须严格对应指定方法的参数类型和数量
      Returns:
      返回结果
    • invoke

      public static <T> T invoke(String className, String methodName, Object[] args)
      执行方法 可执行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

      public static Object invokeGetter(Object object, String name)
      调用Getter方法. 支持多级,如:对象名.对象名.方法
      Parameters:
      object - 对象
      name - 属性名
      Returns:
      the object
    • invokeSetter

      public static void invokeSetter(Object object, String name, Object value)
      调用Setter方法, 仅匹配方法名 支持多级,如:对象名.对象名.方法
      Parameters:
      object - 对象
      name - 属性名
      value - 值
    • actualArgs

      public static Object[] actualArgs(Method method, Object[] args)
      检查用户传入参数:
      • 1、忽略多余的参数
      • 2、参数不够补齐默认值
      • 3、通过NullWrapperBean传递的参数,会直接赋值null
      • 4、传入参数为null,但是目标参数类型为原始类型,做转换
      • 5、传入参数类型不对应,尝试转换类型
      Parameters:
      method - 方法
      args - 参数
      Returns:
      实际的参数数组
    • methodType

      public static MethodType methodType(Executable executable)
      获取指定ExecutableMethodType 此方法主要是读取方法或构造中的方法列表,主要为:
      • 方法:[返回类型, 参数1类型, 参数2类型, ...]
      • 构造:[构造对应类类型, 参数1类型, 参数2类型, ...]
      Parameters:
      executable - 方法或构造
      Returns:
      MethodType
    • isUserLevelMethod

      public static boolean isUserLevelMethod(Method method)