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



我使用了JAVA_OPTS-Xlog:class+load=debug(在Tomcat9 startup.bat中(,虽然它显示的是类名,但它显示的源代码是source: __JVMDefineClass__。有没有办法让我知道Jar的名字,就像它在JAVA 8中显示的那样?

例如

在JAVA 8:[Loaded java.lang.Object from C:Program FilesJavajdk1.7.0_04jrelibrt.jar]中,但是,

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

更新:我正在使用TomeePlus。

我已经使用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

相关内容

  • 没有找到相关文章

最新更新