在java 9之前,监视JavaAgent
由boostrapClassloader
加载到JVM中,以便受监视的应用程序可以访问它们
使用Java 9模块化体系结构,只有java.base module
被加载到Bootstrap类加载器中,因此,Java代理只能访问java.base中的类吗?
默认情况下,它无法访问java.base之外的任何内容吗?
为了访问java.sql等其他模块,需要在javaAgent
内进行哪些更改?
答案 0 :(得分:4)
我刚刚为最新版本和使用
验证了这一点Instrumentation::appendToBootstrapClassLoaderSearch
该类被添加到引导加载程序(null
)并加载到此加载程序的unnamed module
中。这适用于Java 9,ea-176。
答案 1 :(得分: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将类添加到引导类加载器搜索中。