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