在java9之前,通过boostrapClassloader将监控JavaAgent加载到JVM中,以便被监控的应用程序可以访问它们。
使用Java9模块化体系结构,只有java.base module被加载到Bootstrap类加载器中,因此,Java agent只能访问java.base中的类。默认情况下,它不能访问java.base以外的任何内容?
为了访问java.sql等其他模块,需要在javaAgent中进行哪些更改?
发布于 2017-07-04 23:18:11
我刚刚在最新版本中验证了这一点,并在使用
Instrumentation::appendToBootstrapClassLoaderSearch该类被添加到引导加载器(null)中,并加载到此加载器的unnamed module中。对于Java 9、ea-176也是如此。
发布于 2017-07-06 15:34:20
以下是JDK9EA构建中的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)支持添加到引导类加载器搜索程序的类的代理,这些类是使用引导类路径属性或appendToBootstrapClassLoaderSearch应用编程接口添加的。
https://stackoverflow.com/questions/44906662
复制相似问题