3

我正在尝试使用 java.lang.instrument API 向 java.lang.Object 构造函数添加一个静态方法调用。我知道我的基础知识是正确的,因为如果我调用 System.gc() 方法,它就可以工作。我通过在有和没有仪器的情况下运行 -verbosegc 来验证这一点。如果我将方法调用更改为我自己的包中的静态类/方法,我会收到一个致命错误:

本机方法中的线程“主”致命错误中的异常:-javaagent 的处理失败

工作目录中没有创建转储文件,所以我发现很难找出问题所在。其他信息:

  • 我确保静态方法类在转换之前加载到 premain 方法中
  • 静态方法调用不会导致创建新对象
  • 最后一个加载的类是 InterruptedIOException 虽然我认为这只是一个副作用

提前致谢。

4

1 回答 1

1

是的,正如@barry 在他的评论中指出的那样,您必须将Boot-Class-Path定义添加到 Java 代理的清单中。对我来说,我在代理中使用 javassist 来创建字节码,所以我的清单如下所示:

Manifest-Version: 1.0
Premain-Class: com.company.agent.Agent
Agent-Class: com.company.agent.Agent
Boot-Class-Path: javassist-3.18.2-GA.jar agent.jar

我将所有应用程序的 jar 文件与 javassist 和代理 jar 放在同一个 lib 目录中。使用类路径上的所有内容,在同一个文件夹中,它可以工作。

于 2014-10-30T20:35:25.037 回答