为了账号安全,请及时绑定邮箱和手机立即绑定

Java-获取JVM中加载的所有类的列表

Java-获取JVM中加载的所有类的列表

一只名叫tom的猫 2019-10-06 15:49:40
我想获得属于某个包的所有类及其所有子级的列表。这些类可能已经或可能尚未加载到JVM中。
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

这不是编程解决方案,但您可以运行


java -verbose:class ....

然后JVM会丢弃正在加载的内容以及从何处卸载。


[Opened /usr/java/j2sdk1.4.1/jre/lib/rt.jar]

[Opened /usr/java/j2sdk1.4.1/jre/lib/sunrsasign.jar]

[Opened /usr/java/j2sdk1.4.1/jre/lib/jsse.jar]

[Opened /usr/java/j2sdk1.4.1/jre/lib/jce.jar]

[Opened /usr/java/j2sdk1.4.1/jre/lib/charsets.jar]

[Loaded java.lang.Object from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]

[Loaded java.io.Serializable from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]

[Loaded java.lang.Comparable from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]

[Loaded java.lang.CharSequence from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]

[Loaded java.lang.String from /usr/java/j2sdk1.4.1/jre/lib/rt.jar]


查看完整回答
反对 回复 2019-10-06
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

使用反射库,很容易做到:


Reflections reflections = new Reflections("my.pkg", new SubTypesScanner(false));

这将扫描包含my.pkg包的url / s中的所有类。


false参数表示-不排除默认情况下不包括的Object类。

在某些情况下(不同的容器),您可以传递classLoader以及参数。

因此,获得所有类实际上是在传递中获得Object的所有子类型:


Set<String> allClasses = 

    reflections.getStore().getSubTypesOf(Object.class.getName());

(普通方法reflections.getSubTypesOf(Object.class)将导致将所有类加载到PermGen中,并且可能会抛出OutOfMemoryError。您不想这样做...)


如果要获取Object(或任何其他类型)的所有直接子类型,而不一次全部获得其传递子类型,请使用以下命令:


Collection<String> directSubtypes = 

    reflections.getStore().get(SubTypesScanner.class).get(Object.class.getName());


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 3039 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信