如何获取JVM加载的所有软件包名称的列表

我需要获取由JVM加载的所有Java包的名称。 这是为了显示一个像在IDE中发现的软件包浏览器。 通过访问ClassLoader类的受保护“包”字段,我可以获取当前类加载器及其祖先的包列表。 但我无法获得由其他webapps加载的包,因为他们有他们自己的类加载器。 我在Weblogic服务器上测试这个


Weblogic安全模型的预期行为是您无法访问其他Web应用程序的类加载器。 这不是你能够解决的问题 - 请参阅这篇文章以获取更多信息。


您需要使用getParent()遍历类加载器的树,找到所有扩展ClassLoader的类,找到所有当前实例(调试API应该在这里帮助)。 但是,由于安全策略,Web服务器可能无法工作(Web应用程序不允许彼此窥视)。

对于Tomcat,可以选择在加载时记录所有类。 这几乎减慢了服务器的速度,但它可能是开发服务器上的一个选项。

这就是说,我很好奇你为什么需要这个。 最简单的解决方案是列出应用程序带来的所有JAR文件,并使用jar tvf并剥离路径的最后部分(类文件)。


我能想到做到这一点的唯一方法是修改每个Web应用程序,以便您可以发送每个请求以获取其加载的类信息。 然后,您可以创建一个新的Web应用程序,结合现有Web应用程序的响应进行显示。

如果你在一些不错的用户界面中不需要这些信息,那么Sun JVM有许多-XX虚拟机选项可以显示关于类加载的情况。

http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

我对JRockit并不熟悉,但如果它没有类似的选项,我会很惊讶。

链接地址: http://www.djcxy.com/p/58265.html

上一篇: How do I get a list of all package names loaded by the JVM

下一篇: How to set my custom class loader to be the default?