5

我了解 Spring 避免使用-javaagentvm 选项以使其 AspectJ 加载时间编织工作,而是依靠类加载器来启动代理。

我认为 Java 规范规定使用 Java 代理的唯一方法是通过-javaagentvm 选项。

我错了吗?有人可以指导我阅读官方 Java 规范/文档来澄清我的审讯吗?

4

2 回答 2

3

我在这篇有趣的博客文章中找到了一些关于加载 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 之间的区别。

于 2014-03-24T12:16:35.610 回答
0

这里是一个通过注入检测在运行时初始化 aspectj 和 spring-aspects 的库:https ://github.com/subes/invesdwin-instrument

所以不再需要显式的 -javaagent 参数。

于 2015-08-03T13:21:37.030 回答