/* |
|
* 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; |
|
} |