| /* | |
| * Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. Oracle designates this | |
| * particular file as subject to the "Classpath" exception as provided | |
| * by Oracle in the LICENSE file that accompanied this code. | |
| * | |
| * This code 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 General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| package javax.management.loading; | |
| import javax.management.MBeanServer; // for Javadoc | |
| /** | |
| * <p>Instances of this interface are used to keep the list of ClassLoaders | |
| * registered in an MBean Server. | |
| * They provide the necessary methods to load classes using the registered | |
| * ClassLoaders.</p> | |
| * | |
| * <p>The first ClassLoader in a <code>ClassLoaderRepository</code> is | |
| * always the MBean Server's own ClassLoader.</p> | |
| * | |
| * <p>When an MBean is registered in an MBean Server, if it is of a | |
| * subclass of {@link java.lang.ClassLoader} and if it does not | |
| * implement the interface {@link PrivateClassLoader}, it is added to | |
| * the end of the MBean Server's <code>ClassLoaderRepository</code>. | |
| * If it is subsequently unregistered from the MBean Server, it is | |
| * removed from the <code>ClassLoaderRepository</code>.</p> | |
| * | |
| * <p>The order of MBeans in the <code>ClassLoaderRepository</code> is | |
| * significant. For any two MBeans <em>X</em> and <em>Y</em> in the | |
| * <code>ClassLoaderRepository</code>, <em>X</em> must appear before | |
| * <em>Y</em> if the registration of <em>X</em> was completed before | |
| * the registration of <em>Y</em> started. If <em>X</em> and | |
| * <em>Y</em> were registered concurrently, their order is | |
| * indeterminate. The registration of an MBean corresponds to the | |
| * call to {@link MBeanServer#registerMBean} or one of the {@link | |
| * MBeanServer}<code>.createMBean</code> methods.</p> | |
| * | |
| * @see javax.management.MBeanServerFactory | |
| * | |
| * @since 1.5 | |
| */ | |
| public interface ClassLoaderRepository { | |
| /** | |
| * <p>Load the given class name through the list of class loaders. | |
| * Each ClassLoader in turn from the ClassLoaderRepository is | |
| * asked to load the class via its {@link | |
| * ClassLoader#loadClass(String)} method. If it successfully | |
| * returns a {@link Class} object, that is the result of this | |
| * method. If it throws a {@link ClassNotFoundException}, the | |
| * search continues with the next ClassLoader. If it throws | |
| * another exception, the exception is propagated from this | |
| * method. If the end of the list is reached, a {@link | |
| * ClassNotFoundException} is thrown.</p> | |
| * | |
| * @param className The name of the class to be loaded. | |
| * | |
| * @return the loaded class. | |
| * | |
| * @exception ClassNotFoundException The specified class could not be | |
| * found. | |
| */ | |
| public Class<?> loadClass(String className) | |
| throws ClassNotFoundException; | |
| /** | |
| * <p>Load the given class name through the list of class loaders, | |
| * excluding the given one. Each ClassLoader in turn from the | |
| * ClassLoaderRepository, except <code>exclude</code>, is asked to | |
| * load the class via its {@link ClassLoader#loadClass(String)} | |
| * method. If it successfully returns a {@link Class} object, | |
| * that is the result of this method. If it throws a {@link | |
| * ClassNotFoundException}, the search continues with the next | |
| * ClassLoader. If it throws another exception, the exception is | |
| * propagated from this method. If the end of the list is | |
| * reached, a {@link ClassNotFoundException} is thrown.</p> | |
| * | |
| * <p>Be aware that if a ClassLoader in the ClassLoaderRepository | |
| * calls this method from its {@link ClassLoader#loadClass(String) | |
| * loadClass} method, it exposes itself to a deadlock if another | |
| * ClassLoader in the ClassLoaderRepository does the same thing at | |
| * the same time. The {@link #loadClassBefore} method is | |
| * recommended to avoid the risk of deadlock.</p> | |
| * | |
| * @param exclude The class loader to be excluded. May be null, | |
| * in which case this method is equivalent to {@link #loadClass | |
| * loadClass(className)}. | |
| * @param className The name of the class to be loaded. | |
| * | |
| * @return the loaded class. | |
| * | |
| * @exception ClassNotFoundException The specified class could not | |
| * be found. | |
| */ | |
| public Class<?> loadClassWithout(ClassLoader exclude, | |
| String className) | |
| throws ClassNotFoundException; | |
| /** | |
| * <p>Load the given class name through the list of class loaders, | |
| * stopping at the given one. Each ClassLoader in turn from the | |
| * ClassLoaderRepository is asked to load the class via its {@link | |
| * ClassLoader#loadClass(String)} method. If it successfully | |
| * returns a {@link Class} object, that is the result of this | |
| * method. If it throws a {@link ClassNotFoundException}, the | |
| * search continues with the next ClassLoader. If it throws | |
| * another exception, the exception is propagated from this | |
| * method. If the search reaches <code>stop</code> or the end of | |
| * the list, a {@link ClassNotFoundException} is thrown.</p> | |
| * | |
| * <p>Typically this method is called from the {@link | |
| * ClassLoader#loadClass(String) loadClass} method of | |
| * <code>stop</code>, to consult loaders that appear before it | |
| * in the <code>ClassLoaderRepository</code>. By stopping the | |
| * search as soon as <code>stop</code> is reached, a potential | |
| * deadlock with concurrent class loading is avoided.</p> | |
| * | |
| * @param stop The class loader at which to stop. May be null, in | |
| * which case this method is equivalent to {@link #loadClass(String) | |
| * loadClass(className)}. | |
| * @param className The name of the class to be loaded. | |
| * | |
| * @return the loaded class. | |
| * | |
| * @exception ClassNotFoundException The specified class could not | |
| * be found. | |
| * | |
| */ | |
| public Class<?> loadClassBefore(ClassLoader stop, | |
| String className) | |
| throws ClassNotFoundException; | |
| } |