本章提供了一个示例,说明如何将数据从onMethodEnter Advice传递到onMethodExit Advice。
这是本章的功能代码
public class DataProducer{
public void create(){
System.out.println("create data");
}
}
功能代码的逻辑非常简单:在屏幕上打印"create data"。
这是本章使用的Advice代码:
public class LogInterceptor{
public static Logger logger = Logger.getLogger(LogInterceptor.class.getName());
@Advice.OnMethodEnter
public static String methodStart(){
String sharedDataVar = "user01 record";
logger.info("Method start:" + sharedDataVar);
return sharedDataVar;
}
@Advice.OnMethodExit
public static void methodEnd(@Advice.Enter String data){
logger.info("Method end:" + data);
}
}
Advice代码同时使用@Advice.onMethodEnter和@Advice.onMethodExit,分别在methodStart和methodEnd方法中实现。
methodStart方法中有一个局部变量sharedDataVar。
methodStart方法希望与methodEnd方法共享sharedDataVar变量中存储的数据。
为了实现Advice方法之间的数据共享,methodEnd方法必须在其参数之一上注释@Advice.Enter注解。
在本例中,此参数是数据参数。除此之外,methodStart方法必须返回sharedDataVar。通过这些实现,ByteBuddy可以将存储在sharedDataVar中的值传递给数据参数。
要查看数据共享功能的效果,请执行maven build,然后执行Main1.jaya程序将在屏幕上生成以下结果:
Aug 01, 2020 1:00:00 PM com.wpixel.bytebuddy.chapter1.DataProducer create INFO: Method start: user01 record
create data
Aug 01, 2020 1:00:00 PM com.wpixel.bytebuddy.chapter1.DataProducer create INFO: Method end: user01 record
注意到methodEnd方法可以打印"user01 record"的值,该值是从methodStart方法传递的。
结论
本章解释:
- 如何将数据从
onMethodEnter advice方法传递到onMethodExit Advice方法
bytebuddy书籍《Java Interceptor Development with ByteBuddy: Fundamental》
喜欢就点个👍吧