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

问题描述 投票:4回答:1

如何让Java ClassLoader首次输出每个类?

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

我为什么要这样做?

当使用java 9运行我的应用程序时,它会出现错误,但堆栈跟踪不会源自我的代码,所以我不知道是什么导致它。我的想法是输出每个类加载,然后我会更好地了解出错的地方。

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)
java classloader
1个回答
7
投票

您可以将-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$1 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$2 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
...
© www.soinside.com 2019 - 2024. All rights reserved.