获取运行Java应用程序时使用的所有类的列表?

时间:2009-10-05 20:52:14

标签: java jvm

获取运行Java应用程序时使用的所有类的列表的最简单方法是什么?

假设通过运行{/ p>来调用com.package.Foo.main

java com.package.Foo

运行程序后,我想要一个运行程序时使用的所有类的列表:

cat classes-used.txt
com.package.Foo
com.package.FooHelper
com.otherpackage.SomeClass
java.lang.String
java.util.List
java.util.ArrayList

在此上下文中,如果类在程序执行期间由类加载器加载,则定义为使用类,如果存在此类静态块,则将运行类“静态块”。

4 个答案:

答案 0 :(得分:12)

使用标记 verbose:class

运行java
java -verbose:class com.package.Foo

将其附加到文件:

java -verbose:class com.package.Foo > classes-used.txt

等。

它还列出了定义这些文件的jar:

例如这个班级

public class Test {
     public static void main( String [] args ) {
     }
}

我(其中包括)

$ java -verbose:class Test 
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]

答案 1 :(得分:1)

你可以沿着这些方向做点什么:

1)通过在java命令行上传递-verbose:class来启用详细类加载

这将打印一行

[Loaded org.foo.Bar from file:XYZ.jar]

为每个加载的类。

2)使用* nix文本实用程序(grep,sed等)对输出进行后处理,以查找这些消息的所有实例并提取和排序类名

答案 2 :(得分:1)

我相信您也可以使用Jakarta Commons Discovery,其代码类似于以下内容:

ResourceNameIterator classes = new DiscoverClasses().findResourceClasses(Object.class);
while (classes.hasNext()) {
    String className = classes.nextResourceClass().getName();
    Class clazz = classes.nextResourceClass().loadClass();
}

答案 3 :(得分:0)

如果您对使用的方法感兴趣,请参阅我的方法跟踪工具:

https://bitbucket.org/espinosa/methodcallspy

您还可以打开和关闭跟踪,这样您就可以只跟踪所选功能。您可以过滤掉特定的软件包等。方法java -verbose:class对于Spring应用程序并不是很有用,其中几乎所有内容都是最初加载和初始化的,但不一定要使用。