SpringBeanUtils的部分方法类

原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/12060553.html

SpringBeanUtils的部分方法类:

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * TODO
 * SpringBeanUtils的部分方法类
 */
public class SpringBeanUtils {

    /**
     * 实例化一个class
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T instantiate(Class<T> clazz) {
        //Assert.notNull(clazz, "not null");
        if (clazz.isInterface()) {
            System.out.println("no interface");
        } else {
            try {
                return clazz.newInstance();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
                System.out.println("constructor not accesbile");
            } catch (InstantiationException e) {
                e.printStackTrace();
                System.out.println("not abstract class");
            }
        }
        return null;
    }

    /**
     * 实例化一个class
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T stanciateClass(Class<T> clazz) {
        //Assert.notNull(clazz, "not null");
        if (clazz.isInterface()) {
            System.out.println("not interface");
        } else {
            try {
                return instantiateClass(clazz.getDeclaredConstructor());
            } catch (NoSuchMethodException e) {
                System.out.println("no default constructors");
            } catch (LinkageError e) {
                System.out.println("unresolvable class definition");
            }
        }

        return null;
    }

    /**
     * 通过构造器和参数实例化类
     * @param ctor
     * @param args
     * @param <T>
     * @return
     */
    public static <T> T instantiateClass(Constructor<T> ctor, Object... args) {
        //Assert.notNull(ctor, "not null");
        try {
            makeAccessible(ctor);
            /**
             * 未做kotin检测
             */
            return ctor.newInstance(args);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 设置构造器可访问
     * @param ctor
     */
    public static void makeAccessible(Constructor<?> ctor) {
        if ((!Modifier.isPublic(ctor.getModifiers())) || (!Modifier.isPublic(ctor.getDeclaringClass().getModifiers())) && !ctor.isAccessible()) {
            ctor.setAccessible(true);
        }
    }

    /**
     * 查找方法
     * @param clazz
     * @param methodName
     * @param paramTypes
     * @return
     */
    public static Method findMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) {
        try {
            /**
             * 获取该类和所有父类的public方法
             */
            return clazz.getMethod(methodName, paramTypes);
        } catch (NoSuchMethodException e) {
            /**
             * 获取指定的声明过的方法
             */
            return findDeclaredMethod(clazz, methodName, paramTypes);
        }
    }

    /**
     * 获取指定的声明过的方法
     * @param clazz
     * @param methodName
     * @param paramTypes
     * @return
     */
    public static Method findDeclaredMethod(Class<?> clazz, String methodName, Class<?>... paramTypes){
        try {
            return clazz.getDeclaredMethod(methodName, paramTypes);
        } catch (NoSuchMethodException e) {
            return clazz.getSuperclass() != null ? findDeclaredMethod(clazz.getSuperclass(), methodName, paramTypes) : null;
        }
    }

    /**
     * findMethodWithMinimalParameters
     * 暂时不清楚这个方法干什么用的
     * @param methods
     * @param methodName
     * @return
     */
    public static Method findMethodWithMinimalParameters(Method[] methods, String methodName){
        /**
         * 目标方法
         */
        Method targetMethod = null;
        /**
         * 找到的最小参数方法的数量
         */
        int numMethodsFoundWithCurrentMinimumArgs = 0;
        /**
         * 方法数组
         */
        Method[] methodsArr = methods;
        int methodsSize = methods.length;

        for (int i = 0; i < methodsSize; ++i) {
            Method method = methodsArr[i];
            if (method.getName().equals(methodName)){
                int numParams = method.getParameterCount();
                if (targetMethod != null && numParams >= targetMethod.getParameterCount()) {
                    if (!method.isBridge() && targetMethod.getParameterCount() == numParams) {
                        if (targetMethod.isBridge()) {
                            targetMethod = method;
                        } else {
                            ++numMethodsFoundWithCurrentMinimumArgs;
                        }
                    }
                } else {
                    targetMethod = method;
                    numMethodsFoundWithCurrentMinimumArgs = 1;
                }
            }
        }

        if (numMethodsFoundWithCurrentMinimumArgs > 1) {
            throw new IllegalArgumentException("Cannot resolve method '" + methodName + "' to a unique method. Attempted to resolve to overloaded method with the least number of parameters but there were " + numMethodsFoundWithCurrentMinimumArgs + " candidates.");
        } else {
            return targetMethod;
        }
    }

}
原文地址:https://www.cnblogs.com/fanerwei222/p/12060553.html