我试图列出Java类装入器装入我的类的顺序。如果我使用-verbose参数,它将列出它加载每一个接口/类,包括大量的接口,如Serializable、exceptions等。有没有一种方法可以调整这个输出,使它只显示哪些类被加载到我的主方法被定义的类中?
-verbose
k2fxgqgv1#
我想你最好的选择是做以下事情:
main
这里有一个类似的问题和一些答案:Is there a way to get which classes a ClassLoader has loaded?你试过-verbose:class吗?
-verbose:class
yyyllmsg2#
下面是一个sed表达式,它将解析java-verbose:class的输出,以生成加载的类名及其jar文件对。您可以进一步通过排序来获得唯一的jar文件。比如说
java -verbose:class -version 2>/dev/null | sed -ne 's/\[Loaded \(.\+\) from \(.\+\)\]/\2/p' | sort -u
产出
/usr/local/jdk1.7.0_67/jre/lib/rt.jar
s6fujrry3#
对于Java 9+,可以使用-Xlog:class+init。例如,当你启动JVM时,这个命令会打印出类的加载顺序:
-Xlog:class+init
java -Xlog:class+init -version
该命令将打印类似于
[0.018s][info][class,init] 0 Initializing 'java/lang/Object'(no method) (0x0000000800000e60) [0.018s][info][class,init] 1 Initializing 'java/lang/CharSequence'(no method) (0x0000000800009210) [0.018s][info][class,init] 2 Initializing 'java/lang/String' (0x00000008000089b8) [0.018s][info][class,init] 3 Initializing 'java/util/Comparator'(no method) (0x00000008000eb588) [0.018s][info][class,init] 4 Initializing 'java/lang/String$CaseInsensitiveComparator'(no method) (0x000000080010dff8) [0.018s][info][class,init] 5 Initializing 'java/lang/System' (0x0000000800002b68) [0.019s][info][class,init] 6 Initializing 'java/lang/reflect/AnnotatedElement'(no method) (0x0000000800013cd0) [0.019s][info][class,init] 7 Initializing 'java/lang/reflect/Type'(no method) (0x0000000800015210) [0.019s][info][class,init] 8 Initializing 'java/lang/Class' (0x00000008000139e0)
3条答案
按热度按时间k2fxgqgv1#
我想你最好的选择是做以下事情:
main
方法开始和结束之前输出一些固定的文本。这里有一个类似的问题和一些答案:Is there a way to get which classes a ClassLoader has loaded?
你试过
-verbose:class
吗?yyyllmsg2#
下面是一个sed表达式,它将解析java-verbose:class的输出,以生成加载的类名及其jar文件对。您可以进一步通过排序来获得唯一的jar文件。比如说
产出
s6fujrry3#
对于Java 9+,可以使用
-Xlog:class+init
。例如,当你启动JVM时,这个命令会打印出类的加载顺序:该命令将打印类似于