【发布时间】:2021-03-08 01:35:27
【问题描述】:
如果我使用一系列 java 代理来为同一个类进行字节码增强。后者的输入会是前者的输出吗?例如,Agent A 给方法 M 添加了两个局部变量,Agent B 的输入会包含方法 M 中相同的两个局部变量?
【问题讨论】:
-
取决于代理的顺序 - which is specified here.
标签: javaagents
如果我使用一系列 java 代理来为同一个类进行字节码增强。后者的输入会是前者的输出吗?例如,Agent A 给方法 M 添加了两个局部变量,Agent B 的输入会包含方法 M 中相同的两个局部变量?
【问题讨论】:
标签: javaagents
是的,如果代理 B 的转换器将在代理 A 的转换之后被调用:
当有多个转换器时,转换由链接
transform调用组成。也就是说,一次调用transform返回的字节数组将成为下一次调用的输入(通过classfileBuffer参数)。
转换器的调用顺序也在此处指定:
转换按以下顺序应用:
- 无法再转换的变压器
- 无法再转换的原生转换器
- 能够重新转换的变压器
- 能够重新转换的原生转换器
对于重转换,不调用不能重转换的转换器,而是重用之前转换的结果。在所有其他情况下,都会调用此方法。 在这些分组中,转换器按注册顺序调用。本机转换器由 Java 虚拟机工具接口中的 ClassFileLoadHook 事件提供。
【讨论】: