javax.management.loading

接口
public interface ClassLoaderRepository

此接口的实例用于保持在 MBean Server 中注册的 ClassLoader 的列表。它们提供了使用注册的 ClassLoader 来加载类所必需的方法。

ClassLoaderRepository 中的首个 ClassLoader 始终是 MBean Server 本身的 ClassLoader。

当在 MBean Server 中注册 MBean 时,如果它是 ClassLoader 的一个子类,并且它不实现 PrivateClassLoader 接口,那么将它添加到 MBean Server 的 ClassLoaderRepository 的末尾。如果以后从 MBean Server 注销它,则它将从 ClassLoaderRepository 中移除。

ClassLoaderRepository 中的 MBean 顺序是很重要的。对于 ClassLoaderRepository 中的任意两个 MBean XY,如果在 Y 的注册开始之前已完成 X 的注册,则 X 必须出现在 Y 的前面。如果 XY 是同时注册的,则它们的顺序是不确定的。注册 MBean 对应于调用 MBeanServer.registerMBean(java.lang.Object, javax.management.ObjectName) 或某个 MBeanServer.createMBean 方法。

从以下版本开始:
1.5
另请参见:
MBeanServerFactory

方法摘要
 Class<?> loadClass(String className)
          通过类加载器列表加载给定的类名称。
 Class<?> loadClassBefore(ClassLoader stop, String className)
          通过类加载器列表加载给定的类名称,在某个给定的类加载器处停止。
 Class<?> loadClassWithout(ClassLoader exclude, String className)
          通过类加载器列表加载给定的类名称,不包括某个给定的类加载器。
 

方法详细信息

loadClass

Class<?> loadClass(String className)
                   throws ClassNotFoundException

通过类加载器列表加载给定的类名称。依次请求 ClassLoaderRepository 的每个 ClassLoader 通过其 ClassLoader.loadClass(String) 方法来加载类。如果它成功返回一个 Class 对象,则该对象就是此方法的结果。如果抛出 ClassNotFoundException,则继续搜索下一个 ClassLoader。如果抛出另一个异常,则从此方法传播该异常。如果到达列表的末尾,则抛出 ClassNotFoundException

参数:
className - 要被加载的类名称。
返回:
加载的类。
抛出:
ClassNotFoundException - 如果找不到指定的类。

loadClassWithout

Class<?> loadClassWithout(ClassLoader exclude,
                          String className)
                          throws ClassNotFoundException

通过类加载器列表加载给定的类名称,不包括某个给定的类加载器。依次请求 ClassLoaderRepository 的每个 ClassLoader(除 exclude 之外)通过其 ClassLoader.loadClass(String) 方法来加载类。如果它成功返回一个 Class 对象,则该对象就是此方法的结果。如果抛出 ClassNotFoundException,则继续搜索下一个 ClassLoader。如果抛出另一个异常,则从此方法传播该异常。如果到达列表的末尾,则抛出 ClassNotFoundException

注意,如果 ClassLoaderRepository 中的某个 ClassLoader 从其 loadClass 方法调用此方法,那么如果 ClassLoaderRepository 中的另一个 ClassLoader 同时也在执行相同操作,则该 ClassLoader 将发生死锁。推荐使用 loadClassBefore(java.lang.ClassLoader, java.lang.String) 方法以避免死锁风险。

参数:
className - 要被加载的类名称。
exclude - 不包括的类加载器。可能为 null,在这种情况下此方法等效于 loadClass(className)
返回:
加载的类。
抛出:
ClassNotFoundException - 如果找不到指定的类。

loadClassBefore

Class<?> loadClassBefore(ClassLoader stop,
                         String className)
                         throws ClassNotFoundException

通过类加载器列表加载给定的类名称,在某个给定的类加载器处停止。依次请求 ClassLoaderRepository 的每个 ClassLoader 通过其 ClassLoader.loadClass(String) 方法来加载类。如果它成功返回一个 Class 对象,则该对象就是此方法的结果。如果抛出 ClassNotFoundException,则继续搜索下一个 ClassLoader。如果抛出另一个异常,则从此方法传播该异常。如果搜索到达 stop 或列表的末尾,则抛出 ClassNotFoundException

通常从 stop 处的 loadClass 方法调用此方法,以参考 ClassLoaderRepository 中出现在它之前的的加载器。一旦遇到 stop,搜索立即停止,这样就避免了可能出现的并发类加载死锁。

参数:
className - 要被加载的类名称。
stop - 停止处的类加载器。可能为 null,在这种情况下此方法等效于 loadClass(className)
返回:
加载的类。
抛出:
ClassNotFoundException - 如果找不到指定的类。