Java 9 Jigsaw对javaagent的支持

8
Java 9 (特别是Jigsaw)是否有计划支持Java监控代理的特殊需求?
通常,监控代理需要访问默认情况下原始Java应用程序无法访问的类、包和模块。即使jar文件包含module-info.class文件,通过-javaagent命令行参数加载到JVM中的监控代理也不会被加载为模块。我能够为我的监控代理提供所需权限的唯一方法是添加命令行参数,以向所有未命名模块提供这些权限。
1个回答

6

通过扩展Instrumentation,新增了一种方法,可以重新定义任何模块。它允许您添加额外的模块读取、导出、打开、服务使用和提供:

void redefineModule(Module module,
                    Set<Module> extraReads,
                    Map<String,Set<Module>> extraExports,
                    Map<String,Set<Module>> extraOpens,
                    Set<Class<?>> extraUses,
                    Map<Class<?>,List<Class<?>>> extraProvides);

此外,ClassFileTransformer API 已扩展以在转换时注册 Java Module:
default byte[] transform(Module module,
                         ClassLoader loader,
                         String className,
                         Class<?> classBeingRedefined,
                         ProtectionDomain protectionDomain,
                         byte[] classfileBuffer)
                  throws IllegalClassFormatException;

这个模块与仪器API结合使用,可以进行任何必要的调整。

目前,Java代理仍然在类路径上加载,没有应用任何模块化;然而,随着Java 9尚未最终确定,这种情况可能会发生改变。


谢谢。这个帮助了很多。尝试了新的redefineModule()方法,它似乎能够满足我们的需求。 - BradW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接