如何让 Java ClassLoader 在第一次加载时输出每个 class

How do I get Java ClassLoader to output each class when loaded for the first time

如何让 Java ClassLoader 输出每个 class 第一次加载?

是否有一个 java 选项可以做到这一点,或者如果我子 class ClassLoader 并简单地添加一个 System.out.println()在调用 super() 之前如何让我的应用程序使用我的类加载器?

我为什么要这样做?

当 运行 我的应用程序 java 9 它因错误而失败,但堆栈跟踪并非源自我的代码,所以我不知道是什么原因造成的。我的想法是将每个 class 输出为已加载,然后我会更好地了解哪里出了问题。

Uncaught error fetching image:
java.lang.NullPointerException
    at java.desktop/sun.awt.image.URLImageSource.getConnection(Unknown Source)
    at java.desktop/sun.awt.image.URLImageSource.getDecoder(Unknown Source)
    at java.desktop/sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
    at java.desktop/sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
    at java.desktop/sun.awt.image.ImageFetcher.run(Unknown Source)

您可以将 -Xlog 选项与标签 classload 一起使用。像这样:

java -Xlog:class+load <other arguments>

输出将是这样的:

...
[0.083s][info][class,load] jdk.internal.module.ModuleHashes$Builder source: jrt:/java.base
[0.084s][info][class,load] java.util.Collections$UnmodifiableMap source: jrt:/java.base
[0.084s][info][class,load] jdk.internal.module.ModuleResolution source: jrt:/java.base
[0.084s][info][class,load] java.lang.module.ModuleReference source: jrt:/java.base
[0.084s][info][class,load] java.util.function.Supplier source: jrt:/java.base
[0.084s][info][class,load] jdk.internal.module.SystemModuleFinder source: jrt:/java.base
[0.084s][info][class,load] jdk.internal.module.ModuleReferenceImpl source: jrt:/java.base
[0.084s][info][class,load] java.util.KeyValueHolder source: jrt:/java.base
[0.084s][info][class,load] jdk.internal.module.ModuleHashes$HashSupplier source: jrt:/java.base
[0.084s][info][class,load] jdk.internal.module.SystemModuleFinder source: jrt:/java.base
[0.085s][info][class,load] jdk.internal.module.ModuleBootstrap$PerfCounters source: jrt:/java.base
[0.085s][info][class,load] java.util.Optional source: jrt:/java.base
[0.085s][info][class,load] jdk.internal.loader.BootLoader source: jrt:/java.base
...