| /* |
| * Copyright (c) 2002, 2007, 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 className The name of the class to be loaded. |
| * @param exclude The class loader to be excluded. May be null, |
| * in which case this method is equivalent to {@link #loadClass |
| * loadClass(className)}. |
| * |
| * @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 className The name of the class to be loaded. |
| * @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)}. |
| * |
| * @return the loaded class. |
| * |
| * @exception ClassNotFoundException The specified class could not |
| * be found. |
| * |
| */ |
| public Class<?> loadClassBefore(ClassLoader stop, |
| String className) |
| throws ClassNotFoundException; |
| |
| } |