如何从JBoss 5.x下的JavaEE应用程序中获取类加载器ObjectName

如何从JBoss 5.x下的JavaEE应用程序中获取类加载器ObjectName,java,jboss,jakarta-ee,jboss5.x,Java,Jboss,Jakarta Ee,Jboss5.x,我们的JavaEE应用程序有一个服务,它负责安装和启动其他服务,具体取决于存储在数据库中的配置。服务是使用 ServiceControllerMBean.install( org.w3c.dom.Element element, javax.management.ObjectName objectName) 方法。此方法需要类加载器ObjectName作为第二个参数。在JBoss 4.x下,我们使用以下方法获得类加载器名称: final ServiceControllerMBe

我们的JavaEE应用程序有一个服务,它负责安装和启动其他服务,具体取决于存储在数据库中的配置。服务是使用

ServiceControllerMBean.install(
    org.w3c.dom.Element element,
    javax.management.ObjectName objectName)
方法。此方法需要类加载器ObjectName作为第二个参数。在JBoss 4.x下,我们使用以下方法获得类加载器名称:

final ServiceControllerMBean serviceController = 
    (ServiceControllerMBean) MBeanProxy.get(
        ServiceControllerMBean.class,
        ServiceControllerMBean.OBJECT_NAME, server);

final ClassLoader = serviceController.getClass().getClassLoader();

final ObjectName loader = new ObjectName(
    "jmx.loading:UCL=" + Integer.toHexString(classLoader.hashCode()))
但是,这在JBoss 5.x下不起作用,因为类装入器的命名已更改

有人能建议一种在JBoss5.x下获取类加载器名称的方法吗


提前感谢您

找到此问题的文档:

很高兴能看到一个透视图

最后,我发现了一个不错的论坛帖子:

其他信息:

ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println( loader );  // sun.misc.Launcher$AppClassLoader@a12a00
loader = ThreadClassloader.class.getClassLoader();
System.out.println( loader );  // sun.misc.Launcher$AppClassLoader@a12a00

Hpe这有助于您从代码中获取更多信息。

在对该主题进行了一点研究后,我得到了问题的答案。虽然我不太喜欢它,因为它看起来更像另一个黑客。但我会使用它,除非有人提出更优雅的解决方案。因此:

在JBoss 5.1.0(我正在使用的)中,类装入器的注册名称如下:

jboss.classloader:id="vfsfile:<archive-file-name>"
jboss.classloader:id=“vfsfile:”
同时,toString()方法返回的类加载器对象的字符串表示形式如下所示:

BaseClassLoader@<memory-address>{vfsfile:<archive-file-name>}
BaseClassLoader@{vfsfile:}

因此,可以从类加载器字符串表示中提取归档文件名,并从中构造适当的ObjectName。

这不是我问题的确切答案,但您提供的线程解决了我的另一个问题。无论如何,谢谢你:-)