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

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

假设运行以下com.package.Foo.main调用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 

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

使用标志verbose:class运行java

 java -verbose:class com.package.Foo 

要将其附加到文件:

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

等等

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

比如这个class级

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

我有(其中包括)

 $ java -verbose:class Test 
 [已打开/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar]
 [已打开/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar]
 [已打开/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar]
 [已打开/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar]
 [已打开/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar]
 [已打开/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar]
 [从共享对象文件加载java.lang.Object]
 [从共享对象文件加载java.io.Serializable]
 [从共享对象文件加载java.lang.Comparable]
 [从共享对象文件加载java.lang.CharSequence]
 [从共享对象文件加载java.lang.String]
 [从共享对象文件加载java.lang.reflect.GenericDeclaration]
 [从共享对象文件加载java.lang.reflect.Type]
 [从共享对象文件中加载java.lang.reflect.AnnotatedElement]
 [从共享对象文件加载java.lang.Class]
 [从共享对象文件加载java.lang.Cloneable]
 [从共享对象文件加载java.lang.ClassLoader]
 [从共享对象文件加载java.lang.System]

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

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

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

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

这将打印一条线

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

对于每个加载的类。

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

如果您对使用的方法感兴趣,这是我的方法跟踪工具:

https://bitbucket.org/espinosa/methodcallspy

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