4

在 java 9 之前,监控JavaAgent被加载到 JVM 中,boostrapClassloader以便被监控的应用程序可以访问它们

使用 Java 9 模块化架构,只能java.base module在 Bootstrap 类加载器中加载,所以 Java 代理只能访问 java.base 中的类?默认情况下它不能访问 java.base 之外的任何东西?

javaAgent为了访问 java.sql 等其他模块,需要在内部进行什么更改?

4

2 回答 2

4

我刚刚为最新版本和使用时验证了这一点

Instrumentation::appendToBootstrapClassLoaderSearch

该类被添加到引导加载程序 ( null) 并加载unnamed module到此加载程序中。Java 9 ea-176 也是如此。

于 2017-07-04T15:18:10.860 回答
1

这是 JDK 9 EA 版本中 java.lang.instrument 包描述的链接:

http://download.java.net/java/jdk9/docs/api/java/lang/instrument/package-summary.html

“加载代理类和代理类可用的模块/类”部分应该有助于此处的讨论。

至于 java.sql 模块,那么它是不再定义给引导加载程序的几个“非核心”模块之一。将这些模块移动到平台类加载器意味着它们可以在减少权限的情况下运行,因此有助于平台的整体安全性。这对于类路径上的应用程序和库应该是完全透明的,并且应该只被以下代码注意到:(a) 使用 -Xbootclasspath/a 运行,(b) 创建一个自定义类,其中 null 作为父类,以及 (c) 代理支持使用 Boot-Class-Path 属性或 appendToBootstrapClassLoaderSearch API 添加到引导类加载器搜索的类。

于 2017-07-06T07:34:20.307 回答