java instrument api倒底能不能给一个类添加新方法?

java instrument api倒底能不能给一个类添加新方法?

答:
这取决于这个类是否已经被定义过了

    1. 如果还没被定义,就可以,即使这个类是系统类;

    2. 如果已经定义了,这时的修改就是二次插桩(retransform),二次插桩时可以修改方法体,但不允许加减方法。
官方文档说:

引用
The retransformation may change method bodies, the constant pool and attributes. The retransformation must not add, remove or rename fields or methods, change the signatures of methods, or change inheritance. These restrictions maybe be lifted in future versions.

不过要注意最后一句: These restrictions maybe be lifted in future versions. 或许以后就可以了

==============================================

”不能添加新方法”这个原则对java agent的开发提供了一个重大的指导原则:

  1.
如果你的agent是与app一起在命令行启动的(java -javaagent xxx) ,那你的transformation尽可以给类加方法,因为这种模式下transormation在class被定义之前就生效了,不存在retransform的问题;

  2.
如果你的agent是在app启动后才启动的,那你的transformation就不能添加新方法; app启动后再对某个类做transform,可能是retransform(),因为这个类可能在你的agent进入之前就定义过了。

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.