我了解 Spring 避免使用-javaagent
vm 选项以使其 AspectJ 加载时间编织工作,而是依靠类加载器来启动代理。
我认为 Java 规范规定使用 Java 代理的唯一方法是通过-javaagent
vm 选项。
我错了吗?有人可以指导我阅读官方 Java 规范/文档来澄清我的审讯吗?
我了解 Spring 避免使用-javaagent
vm 选项以使其 AspectJ 加载时间编织工作,而是依靠类加载器来启动代理。
我认为 Java 规范规定使用 Java 代理的唯一方法是通过-javaagent
vm 选项。
我错了吗?有人可以指导我阅读官方 Java 规范/文档来澄清我的审讯吗?
我在这篇有趣的博客文章中找到了一些关于加载 Java 代理的信息。
检测代理 要启用 JVM 检测,您必须提供一个(或更多)作为 JAR 文件部署的代理。JAR 文件清单中的属性指定将加载以启动代理的代理类。
有两种加载代理的方法:
- 使用命令行界面:通过将此选项添加到命令行: -javaagent:jarpath[=options] 其中 jarpath 是代理 JAR 文件的路径。options 是代理选项。此开关可以在同一命令行上多次使用,从而创建多个代理。多个代理可以使用相同的 jarpath。
- 通过动态加载:JVM 必须实现一种机制,以便在 VM 启动后的某个时间启动代理。这样,工具可以将代理“附加”到正在运行的 JVM(例如分析器或 ByteMan)
JVM 初始化后,代理类将由系统类加载器加载。如果类加载器未能加载代理,JVM 将中止。...
是的,官方文档/规范将非常受欢迎......
编辑1:最后我遇到了一些相关的官方文档:API Javadoc for dynamic loading an agent as described in the second bullet point above: see here for VirtualMachine class and here for loadAgent method。
编辑 2:另请参阅此其他博客文章。它清楚地解释了在启动时静态加载 javaagent和在运行时动态加载javaagent 之间的区别。
这里是一个通过注入检测在运行时初始化 aspectj 和 spring-aspects 的库:https ://github.com/subes/invesdwin-instrument
所以不再需要显式的 -javaagent 参数。