目录
本章节演示如何用字节码编织技术实现动态代理,阅读之前请先了解字节码原理。如果了解JVM更加容易理解
动态代理的底层实现有两种方法,javasist和ASM,一般情况下用ASM,JDK和CGlib都是用的ASM,这里用代码演示一下ASM如何实现动态代理。
demo场景介绍
目标类:TargetService
切面类:AspectService
生成代理类 :TargetServiceProxy
目标:希望生成这样一个类TargetServiceProxy,用于代理TargetService ,在调用targetService.demoQuest()方法之前调用切面的方法aspectService.preOperation(); 我将用字节码编织技术实现下面这个class
public class TargetServiceProxy extends TargetService {
/**
* 切面类
*/
private TargetService targetService;
/**
* 目标类
*/
private AspectService aspectService;
/**
* 代理类构造方法
* @param targetService 切面类
* @param aspectService 目标类
*/
public TargetServiceProxy(TargetService targetService, AspectService aspectService) {
this.targetService = targetService;
this.aspectService = aspectService;
}
/**
* 测试请求
*/
@Override
public int demoQuest() {
// 先指向切面
aspectService.preOperation();
// 执行目标请求
return targetService.demoQuest();
}
}
先看运行结果:
准备工作
maven引入asm依赖
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>7.0</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId