共享建议。多个建议中的本地用户

作者: JonasKunz创建于 2019年2月13日更新于 2019年2月13日
标签enhancement

在我们的项目中,我们目前正在编写一个 Java 代理,并使用 ByteBuddy 执行一些可配置的仪器化操作。根据配置,我们将对方法应用一个或多个建议。现在的问题是,这些建议希望共享一些方法的局部数据。每当我们决定对方法进行仪器化操作时,我们首先应用了一条建议,其代码如下: public class MyContextAdvice {

@Advice.OnMethodEnter public static void onEnter(@Advice.Local("context") bootstrap.MyContext context) { context = bootstrap.MyContext.enterNewContext(); }

@Advice.OnMethodExit public static void onExit(@Advice.Local("context") bootstrap.MyContex context) { context.close(); } } 随后应用于同一方法的其他建议希望访问由 MyContextAdvice 生成的 context。在我看来,目前使用 Advice.Local 无法实现此行为,因为所有建议都被翻译为单独的 ASMVisitorWrappers,它们彼此毫无了解。是否有其他方法可以实现此行为,或者我们必须回退到使用 ASM?由于代码具有性能关键性,我希望避免使用「黑客」技巧,例如使用 ThreadLocals 维护自定义堆栈。

内容来源: raphw/byte-buddy