本章提供了一个示例,说明如何将数据从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》
喜欢就点个👍吧