获取运行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应用程序不是很有用,几乎所有内容都是初始加载和初始化的,但不一定要使用。