Как получить имя jar, из которого класс загружается во время выполнения JVM в Java 11 - PullRequest
1 голос
/ 13 апреля 2020

Я использовал JAVA_OPTS -Xlog:class+load=debug (внутри Tomcat 9 startup.bat), хотя он показывает имя класса, но показывает источник как source: __JVMDefineClass__. Могу ли я узнать имя Джара, как оно показано в JAVA 8?

Например,

в JAVA 8: [Loaded java.lang.Object from C:\Program Files\Java\jdk1.7.0_04\jre\lib\rt.jar], но,

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

Обновление: я использую TomeePlus.

1 Ответ

0 голосов
/ 15 апреля 2020

Я провел несколько тестов, используя встроенный в Spring Boot Tomcat, и строка __JVM_DefineClass__, используемая в качестве источника класса, не имеет ничего общего с версией JVM. Это произошло в журналах во время моих тестов из-за:

  • внутренних классов , таких как one , которые вы упомянули, или
  • dynamici c сгенерированные классы , например jdk.internal.reflect.GeneratedConstructorAccessor1

Мне кажется, что это связано с тем, что URL-адрес исходного местоположения не был доступен для ClassLoader. Ниже приведен фрагмент исходного кода OpenJDK 11, отвечающего за определение строки __JVM_DefineClass__.

// 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

...