• MethodUtils工具类使用

    类路径:org.apache.commons.lang3.reflect.MethodUtils
    版本:commons-lang3:3.7
    Java doc:MethodUtils API
    说明:MethodUtils是一个通过反射使用或者获取方法的工具类,它提供了各种获取以及使用方法的方法,甚至可以突破Java作用域的限制。

    MethodUtils类图

    构造方法->MethodUtils

    public MethodUtils()
    

    反射执行类方法->invokeMethod

    /**
    * @param object 方法名所在的对象
    * @param methodName 方法名
    * @return 方法反射结果返回值
    */
    public static Object invokeMethod(final Object object, final String methodName);
    
    /**
    * @param object 方法名所在的对象
    * @param forceAccess true为反射时无视Java方法作用域,false则相反
    * @param methodName 方法名
    * @return 方法反射结果返回值
    */
    public static Object invokeMethod(final Object object, final boolean forceAccess, final String methodName);
    
    /**
    * @param object 方法名所在的对象
    * @param methodName 方法名
    * @param args 反射需要传入的参数,支持多个参数
    * @return 方法反射结果返回值
    */
    public static Object invokeMethod(final Object object, final String methodName,Object... args);
    
    /**
    * @param object 方法名所在的对象
    * @param forceAccess true为反射时无视Java方法作用域,false则相反
    * @param methodName 方法名
    * @param args 反射需要传入的参数,支持多个参数
    * @return 方法反射结果返回值
    */
    public static Object invokeMethod(final Object object, final boolean forceAccess, final String methodName,Object... args);
    
    /**
    * @param object 方法名所在的对象
    * @param forceAccess true为反射时无视Java方法作用域,false则相反
    * @param methodName 方法名
    * @param args 反射需要传入的参数,支持多个参数
    * @param parameterTypes 当前方法参数的参数类型
    * @return 方法反射结果返回值
    */
    public static Object invokeMethod(final Object object, final boolean forceAccess, final String methodName,Object[] args, Class<?>[] parameterTypes);
    
    /**
    * @param object 方法名所在的对象
    * @param methodName 方法名
    * @param args 反射需要传入的参数,支持多个参数
    * @param parameterTypes 当前方法参数的参数类型
    * @return 方法反射结果返回值
    */
    public static Object invokeMethod(final Object object, final String methodName,Object[] args, Class<?>[] parameterTypes);
    

    精确的反射执行方法->invokeExactMethod

    /**
    * @param object 方法名所在的对象
    * @param methodName 方法名
    * @return 方法反射结果返回值
    */
    public static Object invokeExactMethod(final Object object, final String methodName);
    
    /**
    * @param object 方法名所在的对象
    * @param methodName 方法名
    * @param args 参数值
    * @return 方法反射结果返回值
    */
    public static Object invokeExactMethod(final Object object, final String methodName,Object... args);
    
    /**
    * @param object 方法名所在的对象
    * @param methodName 方法名
    * @param args 参数值
    * @param parameterTypes 参数类型
    * @return 方法反射结果返回值
    */
    public static Object invokeExactMethod(final Object object, final String methodName,Object... args,Class<?>[] parameterTypes);
    

    反射精确执行静态方法->invokeExactStaticMethod

    /**
    * @param cls 静态方法所在类的类型
    * @param methodName 方法名
    * @param args 参数值
    * @param parameterTypes 参数类型
    * @return 方法反射结果返回值
    */
    public static Object invokeExactStaticMethod(final Class<?> cls, final String methodName,Object[] args, Class<?>[] parameterTypes);
    
    /**
    * @param cls 静态方法所在类的类型
    * @param methodName 方法名
    * @param args 参数值
    * @return 方法反射结果返回值
    */
    public static Object invokeExactStaticMethod(final Class<?> cls, final String methodName,Object[] args);
    

    反射执行静态方法->invokeStaticMethod

    /**
    * @param cls 静态方法所在类的类型
    * @param methodName 方法名
    * @param args 参数值
    * @return 方法反射结果返回值
    */
    public static Object invokeStaticMethod(final Class<?> cls, final String methodName,Object[] args);
    
    /**
    * @param cls 静态方法所在类的类型
    * @param methodName 方法名
    * @param args 参数值
    * @param parameterTypes 参数类型
    * @return 方法反射结果返回值
    */
    public static Object invokeStaticMethod(final Class<?> cls, final String methodName,Object[] args, Class<?>[] parameterTypes);
    

    得到一个能成功反射执行的方法->getAccessibleMethod

    /**
    * @param cls 方法所在类的类型
    * @param methodName 方法名
    * @param parameterTypes 参数类型
    * @return 方法
    */
    public static Method getAccessibleMethod(final Class<?> cls, final String methodName,final Class<?>... parameterTypes);
    
    /**
    * @param method 方法
    * @return 方法
    */
    public static Method getAccessibleMethod(Method method);
    

    根据方法名得到一个可以反射执行且参数类型兼容的方法->getMatchingAccessibleMethod

    /**
    * @param cls 方法所在类的类型
    * @param methodName 方法名
    * @param parameterTypes 参数类型
    * @return 方法
    */
    public static Method getMatchingAccessibleMethod(final Class<?> cls,final String methodName, final Class<?>... parameterTypes);
    

    得到一个方法->getMatchingMethod

    /**
    * @param cls 方法所在类的类型
    * @param methodName 方法名
    * @param parameterTypes 参数类型
    * @return 方法
    */
    public static Method getMatchingMethod(final Class<?> cls, final String methodName,final Class<?>... parameterTypes);
    

    获得一个方法的所有父级方法,直到接口->getOverrideHierarchy

    /**
    * @param method 方法
    * @param interfacesBehavior 寻找到的最终接口
    * @return 所有重写的方法
    */
    public static Set<Method> getOverrideHierarchy(final Method method, final Interfaces interfacesBehavior);
    

    获取含有给定注解的所有方法->getMethodsListWithAnnotation

    /**
    * @param cls 方法所在类
    * @param annotationCls 注解
    * @param searchSupers 是否搜索父类
    * @param ignoreAccess 是否无视作用域
    * @return 符合条件的方法list
    */
    public static List<Method> getMethodsListWithAnnotation(final Class<?> cls,final Class<? extends Annotation> annotationCls,final boolean searchSupers,final boolean ignoreAccess);
    
    /**
    * @param cls 方法所在类
    * @param annotationCls 注解
    * @return 方法list
    */
    public static Method[] getMethodsListWithAnnotation(final Class<?> cls, final Class<? extends Annotation> annotationCls);
    

    获取当前类中含有给定注解且能被反射执行的所有方法(数组)->getMethodsWithAnnotation

    /**
    * @param cls 方法所在类
    * @param annotationCls 注解
    * @return 方法数组
    */
    public static Method[] getMethodsWithAnnotation(final Class<?> cls, final Class<? extends Annotation> annotationCls);
    
    /**
    * @param cls 方法所在类
    * @param annotationCls 注解
    * @param searchSupers 是否搜索父类
    * @param ignoreAccess 是否无视作用域
    * @return 方法数组
    */
    public static Method[] getMethodsWithAnnotation(final Class<?> cls, final Class<? extends Annotation> annotationCls,final boolean searchSupers, final boolean ignoreAccess);
    

    得到方法上指定注解的注解对象->getAnnotation

    /**
    * @param <A> 注解泛型
    * @param method 方法
    * @param annotationCls 注解类
    * @param searchSupers 是否搜索父类
    * @param ignoreAccess 是否无视作用域
    * @return 第一次搜索到的注解对象
    */
    public static <A extends Annotation> A getAnnotation(final Method method, final Class<A> annotationCls,final boolean searchSupers, final boolean ignoreAccess);