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