ByteBuddy(七)—将数据从OnMethodEnter Advice传递到Exit Advice

本章提供了一个示例,说明如何将数据从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,分别在methodStartmethodEnd方法中实现。
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》

喜欢就点个吧

你可能感兴趣的:(ByteBuddy(七)—将数据从OnMethodEnter Advice传递到Exit Advice)