多个java代理代理同一个类

问题描述

如果我使用 Java 代理序列对同一个类进行字节码增强。后者的输入会是前者的输出吗?例如,代理A向方法M添加了两个局部变量,代理B的输入将包含方法M中相同的两个局部变量?

解决方法

是的,如果代理 B 的转换器将在代理 A 的转换之后被调用:

当有多个转换器时,转换是通过链接 transform 调用来组成的。也就是说,一次调用 transform 返回的字节数组成为下一次调用的输入(通过 classfileBuffer 参数)。

(Source)

转换器的调用顺序也在此处指定:

转换按以下顺序应用:

  • 无法重新转换的转换器
  • 无法重新转换的原生转换器
  • 可重新转换的转换器
  • 具有重新转换能力的原生转换器

对于重转换,不调用不能重转换的转换器,而是重用前一次转换的结果。在所有其他情况下,将调用此方法。 在这些分组中的每一个中,转换器按注册的顺序调用。本地转换器由 Java 虚拟机工具接口中的 ClassFileLoadHook 事件提供)。