我使用了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