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

在Java11中,如何获取JVM在运行时从中加载类的jar名称,java,classloader,java-11,tomcat9,java-opts,Java,Classloader,Java 11,Tomcat9,Java Opts,我使用了JAVA_OPTS-Xlog:class+load=debug(在Tomcat 9 startup.bat中),虽然它显示了类名,但它显示的源代码是源代码:u JVM DefineClass。有没有办法知道Jar的名称,就像Java8中显示的那样 例如 在JAVA 8中:[从C:\Program Files\JAVA\jdk1.7.0\u 04\jre\lib\rt.jar加载JAVA.lang.Object],但是 在Java11中:com.fasterxml.jackson.data

我使用了JAVA_OPTS
-Xlog:class+load=debug
(在Tomcat 9 startup.bat中),虽然它显示了类名,但它显示的源代码是
源代码:u JVM DefineClass
。有没有办法知道Jar的名称,就像Java8中显示的那样

例如

在JAVA 8中:
[从C:\Program Files\JAVA\jdk1.7.0\u 04\jre\lib\rt.jar加载JAVA.lang.Object]
,但是

在Java11中:
com.fasterxml.jackson.databind.util.ClassUtil$Ctor源代码:\uuujvm\udefineclass\uuuu


更新:我正在使用TomeePlus。

我已经使用Spring Boot的嵌入式Tomcat运行了一些测试,并且用作类源的
\ujvm\udefineclass\uujvm>字符串与JVM版本无关。在我的测试过程中,由于以下原因,日志中出现了这种情况:

  • 内部类如您提到的,或
  • 动态生成的类,例如
    jdk.internal.reflect.generatedconstructor或accessor 1

在我看来,这是因为类加载器没有提供源位置URL。您可以在下面阅读负责定义
\uuujvm\udefineclass\uuu
字符串的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__";
  ...

我已经使用Spring Boot的嵌入式Tomcat运行了一些测试,并且用作类源的
\ujvm\udefineclass\uujvm>字符串与JVM版本无关。在我的测试过程中,由于以下原因,日志中出现了这种情况:

  • 内部类如您提到的,或
  • 动态生成的类,例如
    jdk.internal.reflect.generatedconstructor或accessor 1

在我看来,这是因为类加载器没有提供源位置URL。您可以在下面阅读负责定义
\uuujvm\udefineclass\uuu
字符串的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__";
  ...

是将“JVM\u DefineClass”字符串显示为所有其他类的源,还是仅显示此类的源?
\ujvm\u DefineClass\uuu
显示所有类,但从Tomcat lib加载的类除外。对于从tomcat lib文件夹加载的类,它显示了正确的lib名称和路径。我还看到Tomee的TempClassLoader加载的类有这样的源,但是URLClassLoader加载的类包含jar名称。“JVM\u DefineClass”字符串是显示为所有其他类的源还是仅显示为该类的源?
\uuuuuuujvm\u DefineClass\uuu
显示除从Tomcat库加载的类之外的所有类。对于从tomcat lib文件夹加载的类,它显示了正确的库名称和路径。我还看到Tomee的TempClassLoader加载的类有这样的源,但URLClassLoader加载的类包含jar名称。某些类路径包含额外的“/”,这导致它们的URL值无效。为了调试,我修改了TempClassLoader,我认为这可能解决了我的问题。谢谢。某些类路径包含额外的“/”,这导致它们的URL值无效。为了调试,我修改了TempClassLoader,我认为这可能解决了我的问题。谢谢