首页 > 解决方案 > java - 如何在Java 11中获取JVM在运行时加载的jar的名称

问题描述

我使用了 JAVA_OPTS -Xlog:class+load=debug(在 Tomcat 9 startup.bat 中),虽然它显示了类名,但它显示源为source: __JVMDefineClass__. 有什么方法可以知道 Jar 的名称,就像它在 JAVA 8 中显示的那样?

例如

在 JAVA 8 中:[Loaded java.lang.Object from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar],但是,

在 JAVA 11 中: com.fasterxml.jackson.databind.util.ClassUtil$Ctor source: __JVM_DefineClass__

更新:我正在使用 TomeePlus。

标签: javaclassloaderjava-11tomcat9java-opts

解决方案


我已经使用 Spring Boot 的嵌入式 Tomcat 运行了一些测试,并且__JVM_DefineClass__用作类源的字符串与 JVM 版本无关。它发生在我的测试期间的日志中,原因是:

  • 内部类,例如您提到的那个或者
  • 动态生成的类,例如jdk.internal.reflect.GeneratedConstructorAccessor1

在我看来,这是因为源位置 URL 尚未对 ClassLoader 可用。您可以阅读下面负责定义__JVM_DefineClass__字符串的 OpenJDK 11 源代码片段。

// common code for JVM_DefineClass() and JVM_DefineClassWithSource()
static jclass jvm_define_class_common(JNIEnv *env, const char *name,
                                  jobject loader, const jbyte *buf,
                                  jsize len, jobject pd, const char *source,
                                  TRAPS) {
  if (source == NULL)  source = "__JVM_DefineClass__";
  ...

OpenJDK / jdk / jdk11


推荐阅读