集册 Java实例教程 通过可选的指定类(按照其指定顺序)来加载该类,如果找不到,则通过当前线程的上下文类加载器加载该类,如果找不到,则从调用者类加载器加载该类作为最后的选择。

通过可选的指定类(按照其指定顺序)来加载该类,如果找不到,则通过当前线程的上下文类加载器加载该类,如果找不到,则从调用者类加载器加载该类作为最后的选择。

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

421
通过可选的指定类(按照其指定顺序)来加载该类,如果找不到,则通过当前线程的上下文类加载器加载该类,如果找不到,则从调用者类加载器加载该类作为最后的选择。

/*

 * Copyright 2011-2013 Amazon Technologies, Inc.

 *

 * Licensed 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://aws.amazon.com/apache2.0

 *

 * This file 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.

 */

//package com.nowjava;
/*时 代 J a v a 公 众 号 - N o w J a v  a . c o m 提 供*/

public class Main {

    public static void main(String[] argv) throws Exception {

        String fqcn = "nowjava.com";

        Class classes = String.class;

        System.out.println(loadClass(fqcn, classes));

    }


    /**

     * Loads the class via the optionally specified classes in the order of

     * their specification, and if not found, via the context class loader of

     * the current thread, and if not found, from the caller class loader as the

     * last resort.

     * 

     * @param fqcn

     *            fully qualified class name of the target class to be loaded

     * @param classes

     *            class loader providers

     * @return the class loaded; never null

     * 

     * @throws ClassNotFoundException

     *             if failed to load the class

     */

    public static Class<?> loadClass(String fqcn, Class<?>... classes)

            throws ClassNotFoundException {

        return loadClass(fqcn, true, classes);

    }//来自 n o w    j a v a  . c o m


    /**

     * If classesFirst is false, loads the class via the context class

     * loader of the current thread, and if not found, via the class loaders of

     * the optionally specified classes in the order of their specification, and

     * if not found, from the caller class loader as the

     * last resort.

     * <p>

     * If classesFirst is true, loads the class via the optionally

     * specified classes in the order of their specification, and if not found,

     * via the context class loader of the current thread, and if not found,

     * from the caller class loader as the last resort.

     * 

     * @param fqcn

     *            fully qualified class name of the target class to be loaded

     * @param classesFirst

     *            true if the class loaders of the optionally specified classes

     *            take precedence over the context class loader of the current

     *            thread; false if the opposite is true.

     * @param classes

     *            class loader providers

     * @return the class loaded; never null

     * 

     * @throws ClassNotFoundException if failed to load the class

     */

    public static Class<?> loadClass(String fqcn, boolean classesFirst,

            Class<?>... classes) throws ClassNotFoundException {

        Class<?> target = null;

        if (classesFirst) {

            target = loadClassViaClasses(fqcn, classes);

            if (target == null) {

                target = loadClassViaContext(fqcn);

            }

        } else {

            target = loadClassViaContext(fqcn);

            if (target == null) {

                target = loadClassViaClasses(fqcn, classes);

            }

        }

        return target == null ? Class.forName(fqcn) : target;

    }


    private static Class<?> loadClassViaClasses(String fqcn,

            Class<?>[] classes) {

        if (classes != null) {

            for (Class<?> c : classes) {

                ClassLoader loader = c.getClassLoader();

                if (loader != null) {

                    try {

                        
展开阅读全文