集册 Java实例教程 获取匹配的可访问构造函数

获取匹配的可访问构造函数

欢马劈雪     最近更新时间:2020-01-02 10:19:05

504
获取匹配的可访问构造函数
/** nowjava - 时  代  Java 提供 **/

/*

 **        DroidPlugin Project

 **

 ** Copyright(c) 2015 Andy Zhang <zhangyong232@gmail.com>

 **

 ** This file is part of DroidPlugin.

 **

 ** DroidPlugin is free software: you can redistribute it and/or

 ** modify it under the terms of the GNU Lesser General Public

 ** License as published by the Free Software Foundation, either

 ** version 3 of the License, or (at your option) any later version.

 **

 ** DroidPlugin is distributed in the hope that it will be useful,

 ** but WITHOUT ANY WARRANTY; without even the implied warranty of

 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

 ** Lesser General Public License for more details.

 **

 ** You should have received a copy of the GNU Lesser General Public

 ** License along with DroidPlugin.  If not, see <http://www.gnu.org/licenses/lgpl.txt>

 **

 **/

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

import java.util.HashMap;

import java.util.Map;


public class Main{

    public static <T> Constructor<T> getMatchingAccessibleConstructor(

            final Class<T> cls, final Class<?>... parameterTypes) {

        Validate.isTrue(cls != null, "class cannot be null");

        // see if we can find the constructor directly

        // most of the time this works and it's much faster

        try {

            final Constructor<T> ctor = cls.getConstructor(parameterTypes);

            MemberUtils.setAccessibleWorkaround(ctor);

            return ctor;

        } catch (final NoSuchMethodException e) { // NOPMD - Swallow

        }

        Constructor<T> result = null;

        /*

         * (1) Class.getConstructors() is documented to return Constructor<T> so as

         * long as the array is not subsequently modified, everything's fine.

         */// 来 自 时代Java公众号 - nowjava.com

        final Constructor<?>[] ctors = cls.getConstructors();


        // return best match:

        for (Constructor<?> ctor : ctors) {

            // compare parameters

            if (MemberUtils.isAssignable(parameterTypes,

                    ctor.getParameterTypes(), true)) {

                // get accessible version of constructor

                ctor = getAccessibleConstructor(ctor);

                if (ctor != null) {

                    MemberUtils.setAccessibleWorkaround(ctor);

                    if (result == null

                            || MemberUtils.compareParameterTypes(

                                    ctor.getParameterTypes(),

                                    result.getParameterTypes(),

                                    parameterTypes) < 0) {

                        // temporary variable for annotation, see comment above (1)

                        @SuppressWarnings("unchecked")

                        final Constructor<T> constructor = (Constructor<T>) ctor;

                        result = constructor;

                    }

                }

            }

        }

        return result;

    }

    private static <T> Constructor<T> getAccessibleConstructor(

            final Constructor<T> ctor) {

        Validate.isT
展开阅读全文