在java 9之前,监视JavaAgent
通过boostrapClassloader
加载到JVM中,以便被监视的应用程序可以访问它们
使用 Java 9 模块化架构,只有java.base module
加载到 Bootstrap 类加载器中,因此,Java 代理只能访问 java.base 中的类? 默认情况下,它无法访问java.base之外的任何内容?
为了访问 java.sql 等其他模块,需要在javaAgent
内部更改什么?
我刚刚针对最新版本和使用时验证了这一点
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 添加到引导类加载器搜索的类。