集册 Java实例教程 使用由给定参数类型和值描述的构造方法创建指定类型的新实例。

使用由给定参数类型和值描述的构造方法创建指定类型的新实例。

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

508
使用由给定参数类型和值描述的构造方法创建指定类型的新实例。

/*

 * Licensed to the Apache Software Foundation (ASF) under one or more

 * contributor license agreements.  See the NOTICE file distributed with

 * this work for additional information regarding copyright ownership.

 * The ASF licenses this file to You under the Apache License, Version 2.0

 * (the "License"); you may not use this file except in compliance with

 * the License.  You may obtain a copy of the License at

 * 

 *      http://www.apache.org/licenses/LICENSE-2.0

 * 

 * Unless required by applicable law or agreed to in writing, software

 * distributed under the License is distributed on an "AS IS" BASIS,

 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

 * See the License for the specific language governing permissions and

 * limitations under the License.

 */

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;
//来自 时代Java - nowjava.com

public class Main{

    /**

     * Creates a new instance of the specified <tt><i>type</i></tt>

     * using a {@link Constructor} described by the given parameter types

     * and values.

     *

     * @param type      the type of {@link Object} to be created

     * @param argTypes  a non-<tt>null</tt> array of types describing the parameters to the {@link Constructor}.

     * @param argValues a non-<tt>null</tt> array containing the values of the parameters to the {@link Constructor}.

     * @return a new instance of the specified <tt><i>type</i></tt>

     *         using a {@link Constructor} described by the given parameter types

     *         and values.

     * @exception InstantiationException

     * @exception IllegalAccessException

     * @exception InvocationTargetException

     */

    public static Object invokeConstructor(Class type, Class[] argTypes,

            Object[] argValues) throws InstantiationException,

            IllegalAccessException, InvocationTargetException {

        return ConstructorUtil.getConstructor(type, argTypes).newInstance(

                argValues);

    }

    /**

     * Returns a {@link Constructor} for the given method signature, or <tt>null</tt>

     * if no such <tt>Constructor</tt> can be found.

     *

     * @param type     the (non-<tt>null</tt>) type of {@link Object} the returned {@link Constructor} should create

     * @param argTypes a non-<tt>null</tt> array of types describing the parameters to the {@link Constructor}.

     * @return a {@link Constructor} for the given method signature, or <tt>null</tt>

     *         if no such <tt>Constructor</tt> can be found.

     * @see #invokeConstructor

     */
     /**
     n o w    j a v a  . c o m 提供 
     **/

    public static Constructor getConstructor(Class type, Class[] argTypes) {

        if (null == type || null == argTypes) {

            throw new NullPointerException();

        }

        Constructor ctor = null;

        try {

            ctor = type.getConstructor(argTypes);

        } catch (Exception e) {

            ctor = null;

        }

        if (null == ctor) {

            // no directly declared matching constructor,

            // look for something that will work

            // XXX this should really be more careful to

            //     adhere to the jls mechanism for late binding

            Constructor[] ctors = type.getConstructors();

            for (int i = 0; i < ctors.length; i++) {

                Class[] paramtypes = ctors[i].getParameterTypes();

                if (paramtypes.length == argTypes.length) {

                    boolean ca
展开阅读全文