Java 9中是否有任何计划(特别是Jigsaw)来支持Java监视代理的特殊要求?
通常,监视代理程序需要能够访问默认情况下不可用于原始Java应用程序的类,包和模块。通过-javaagent命令行参数加载到JVM中的监视代理程序不会作为模块加载,即使jar文件包含module-info.class文件也是如此。我能够为监控代理提供所需权限的唯一方法是添加命令行参数,为所有未命名的模块提供这些权限。
答案 0 :(得分: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尚未最终而改变。