使用ASM实现动态代理

本文通过实例演示如何利用ASM字节码技术实现动态代理。首先介绍了一个代理场景,然后讲解了准备工作,包括引入ASM依赖,并展示了被代理目标类TargetService、切面类AspectService的代码。最后详细解释了如何编织代理类TargetServiceProxy,使其在调用TargetService方法前执行切面操作。
摘要由CSDN通过智能技术生成

目录

demo场景介绍

准备工作

代码演示


本章节演示如何用字节码编织技术实现动态代理,阅读之前请先了解字节码原理。如果了解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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值