Java Attach API的限制和范围

时间:2013-04-01 13:22:01

标签: java jvm classloader bytecode

据我所知,Java 6中引入的Attach API允许通过代理对目标 JVM 中运行的类进行进程间修改。我的问题是:

  1. 此策略仅限于目标 JVM 尚未加载的类的工具吗?和
  2. 这些转变的局限是什么?例如,只能修改现有方法的主体?或者可以更改类定义中的所有内容?

1 个答案:

答案 0 :(得分:2)

  1. 您可以使用ClassFileTransformer拦截已加载或要加载的类。但是,如果重新传输的方法具有活动堆栈帧,则这些活动帧将继续运行原始方法的字节码。重新格式化的方法将用于新的调用。
  2. 重新定义/重新转换可能会更改方法体,常量池和属性。重定义/重新转换不得添加,删除或重命名字段或方法,更改方法的签名或更改继承。在将来的版本中可能会取消这些限制。在应用转换之前,不会检查,验证和安装类文件字节,如果生成的字节错误,则此方法将引发异常。
  3. Instrumentation界面的javadoc包含您询问的大部分信息。