<html>
<head>
<title>javax.management.loading package</title>
<!--
Copyright (c) 1999, 2006, 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
CA 95054 USA or visit www.sun.com if you need additional information or
have any questions.
-->
</head>
<body bgcolor="white">

      <p>Provides the classes which implement advanced dynamic
	loading.  See the chapter <em>Advanced Dynamic Loading</em> in
	the <a href="#spec">JMX Specification</a>.</p>

      <p>An MBean that is of a subclass of {@link
	java.lang.ClassLoader} can be used as a class loader to create
	other MBeans via the method {@link
	javax.management.MBeanServer#createMBean(String, ObjectName,
	ObjectName, Object[], String[])}, and to instantiate arbitrary
	objects via the method {@link
	javax.management.MBeanServer#instantiate(String, ObjectName,
	Object[], String[])}.  The {@link
	javax.management.loading.MLet MLet} class is an example of
	such an MBean.  It is a {@link java.net.URLClassLoader
	URLClassLoader}, so the list of URLs to load classes from can
	be configured.</p>

      <p>Additionally, an <code>MLet</code> can read a configuration
	file that specifies a set of MBeans to be registered in the same
	MBean Server as the <code>MLet</code>.</p>

      <p>Every MBean Server has a <em>class loader repository</em>
	containing all MBeans registered in that MBean Server that
	are of a subclass of {@link java.lang.ClassLoader}.  The class
	loader repository is used by the forms of the
	<code>createMBean</code> and <code>instantiate</code> methods
	in the {@link javax.management.MBeanServer MBeanServer}
	interface that do not have an explicit loader parameter.  It
	is also used by the <code>MLet</code> class when it does not
	find a class in its own set of URLs.</p>

      <p>If an MBean implements the interface {@link
	javax.management.loading.PrivateClassLoader PrivateClassLoader},
	then it is not added to the class loader repository.  The class
	{@link javax.management.loading.PrivateMLet PrivateMLet} is a
	subclass of <code>MLet</code> that implements
	<code>PrivateClassLoader</code>.</p>

    <p id="spec">
    @see <a href="{@docRoot}/../technotes/guides/jmx/">
      Java SE 6 Platform documentation on JMX technology</a>,
    in particular the 
    <a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
      JMX Specification, version 1.4(pdf).</a>

      @since 1.5
</BODY>
</HTML>
