2017-02-22 63 views
8

在Java 9(特别是Jigsaw)中是否有任何计划来支持Java监视代理的特殊要求?Java 9对javaagent的Jigsaw支持

通常情况下,监视代理需要能够访问默认情况下不可用于原始Java应用程序的类,包和模块。通过-javaagent命令行参数加载到JVM的监视代理程序不会作为模块加载,即使jar文件包含module-info.class文件。我能够为监控代理提供所需权限的唯一方法是添加命令行参数,这些参数为所有未命名的模块提供这些权限。

回答

6

Instrumentation class was extended带有允许重新定义任何模块的方法。它允许你添加额外的模块读取,出口,打开后,服务的用途和提供中:

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尚未最终确定。

+0

谢谢。这帮了很多。尝试新的redefineModule()方法,它似乎做我们需要的 – BradW