如何获取Java 11中的JVM在运行时从中加载类的jar的名称

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

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

例如

在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。

java classloader java-11 tomcat9 java-opts
1个回答
0
投票

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

  • 内部类,例如您提到的one,或
  • 动态生成的类
  • ,例如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

© www.soinside.com 2019 - 2024. All rights reserved.