使用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!
执行方法之后