java - java - 如何在Java 11中获取JVM在运行时加载的jar的名称
问题描述
我使用了 JAVA_OPTS -Xlog:class+load=debug
(在 Tomcat 9 startup.bat 中),虽然它显示了类名,但它显示源为source: __JVMDefineClass__
. 有什么方法可以知道 Jar 的名称,就像它在 JAVA 8 中显示的那样?
例如
在 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。
解决方案
我已经使用 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__";
...
推荐阅读
- javascript - 将网络摄像机流式传输到 Angular 项目中的浏览器
- c# - 在wpf中按下ALT键时如何禁用带下划线的列表框项目
- r - 如何调整绘图图例中两列之间的空间?
- python-2.7 - 我得到 barplot ,但没有得到 scatterplot
- python-unittest - freeze_time 不适用于默认参数
- firebase - 你如何显示同一用户的 2 个 tableViews?Firebase 数据库
- java - 按特定顺序从 ResultSet 检索和显示值
- c# - 同时从 S3 读取文件
- spring - 使用 Spring Boot 更新密码并且 JPA 不起作用
- c# - microservices 连接尝试失败,因为连接方在一段时间后没有正确响应