【问题标题】:How do I get Java ClassLoader to output each class when loaded for the first time第一次加载时如何让Java ClassLoader输出每个类
【发布时间】:2019-03-30 23:39:21
【问题描述】:

如何让 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)

【问题讨论】:

  • 您确定要在加载类时收到消息吗?考虑到 JRE 加载的眼镜,这将是相当多的输出。
  • @Turing85 它只是暂时的,我感兴趣的是在抛出错误之前加载的内容

标签: java classloader


【解决方案1】:

您可以将-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
...

【讨论】:

  • 太好了,谢谢你,如果我只是做了 -Xlog:class+load
  • @PaulTaylor 是的,默认情况下它输出到标准输出,但我通常更喜欢单独的文件,这样它就不会与程序的其他输出混在一起;)
  • 这和 java -verbose:class 一样吗?
  • 当我使用你所抱怨的文件名时,猜测需要完整路径或文件需要已经存在
  • @GonenI 它看起来和我一样,但是-verbose:class 不允许你指定输出位置 afaik,虽然优点是它是标准选项。
猜你喜欢
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
相关资源
最近更新 更多