获取运行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
在此上下文中,如果类在程序执行期间由类加载器加载,则定义为使用类,如果存在此类静态块,则将运行类“静态块”。
答案 0 :(得分:12)
使用标记 verbose:class
运行javajava -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应用程序并不是很有用,其中几乎所有内容都是最初加载和初始化的,但不一定要使用。