在 java 9 之前,监控JavaAgent
被加载到 JVM 中,boostrapClassloader
以便被监控的应用程序可以访问它们
使用 Java 9 模块化架构,只能java.base module
在 Bootstrap 类加载器中加载,所以 Java 代理只能访问 java.base 中的类?默认情况下它不能访问 java.base 之外的任何东西?
javaAgent
为了访问 java.sql 等其他模块,需要在内部进行什么更改?
在 java 9 之前,监控JavaAgent
被加载到 JVM 中,boostrapClassloader
以便被监控的应用程序可以访问它们
使用 Java 9 模块化架构,只能java.base module
在 Bootstrap 类加载器中加载,所以 Java 代理只能访问 java.base 中的类?默认情况下它不能访问 java.base 之外的任何东西?
javaAgent
为了访问 java.sql 等其他模块,需要在内部进行什么更改?
我刚刚为最新版本和使用时验证了这一点
Instrumentation::appendToBootstrapClassLoaderSearch
该类被添加到引导加载程序 ( null
) 并加载unnamed module
到此加载程序中。Java 9 ea-176 也是如此。
这是 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 添加到引导类加载器搜索的类。