使用Javassist实现AOP

在spring等框架中经常会用到AOP对已有的功能做切面处理,比如:日志记录,数据库事务处理,缓存,权限处理等,需要用到动态代理,常见的动态代理有:

JDK ProxyGenerator、CGLIB、Javassist、ASM

其原理都是修改字节码生成class文件,然后通过类加载器重新加载动态生成的class文件

其中Javassist使用最为简单:

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.28.0-GA</version>
</dependency>
package com.example.javassist;

public class Hello {

    public static void say() {
        System.out.println("hello world!");
    }

}
package com.example.javassist;

import javassist.*;

public class Javassist {

    public static void main(String[] args) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        CtClass cc = pool.get("com.example.javassist.Hello");
        CtMethod personFly = cc.getDeclaredMethod("say");
        personFly.insertBefore("System.out.println(\"执行方法之前\");");
        personFly.insertAfter("System.out.println(\"执行方法之后\");");
        cc.toClass();
        Hello.say();
    }

}

输出结果:

执行方法之前
hello world!
执行方法之后
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容