Java中提供的动态代理简单练习

本文介绍了一个Java动态代理的具体实现案例,包括定义代理接口、实现业务逻辑类、创建动态代理类及测试过程。通过此例,读者可以了解如何利用Java反射机制实现动态代理,以及如何在方法调用前后加入自定义的横切面逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先创建代理类:

public interface Flying {

    void m1();

    int m2(int num);
}

接着创建被代理的业务逻辑类来实现代理类,并重写被代理的方法:

/**
 * @decription: 业务逻辑类,也是被代理的类
 */
public class Swan implements Flying {
    @Override
    public void m1() {
        System.out.println("方法一");
    }

    @Override
    public int m2(int num) {
        System.out.println("方法二");
        return num;
    }
}

接着真正实现Java中的动态代理(实现InvocationHandler接口):

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @decription: Java中提供的动态代理
 */
public class MyLog implements InvocationHandler {

    private Object target;//要代理的目标

    //使用构造方法传入要代理的目标
    public MyLog(Object target) {
        this.target = target;
    }

    /**
     * 横切面逻辑
     *
     * @param proxy  产生代理的实例
     * @param method 需要代理的方法
     * @param args   方法参数
     * @return 代理方法的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //方法执行之前做的事情
        System.out.println("Method before....");
        //使用反射执行方法
        Object result = method.invoke(target, args);
        //方法执行之后要做的事情
        System.out.println("Method after....");
        return result;
    }
}

最后编写测试类:


import java.lang.reflect.Proxy;

/**
 * @decription: 测试
 */
public class Test {
    public static void main(String[] args) {
        Swan swan = new Swan();
        //获取代理
        Flying flying = (Flying) Proxy.newProxyInstance(Test.class.getClassLoader(),
                swan.getClass().getInterfaces(),
                new MyLog(swan));
        flying.m1();
        System.out.println("--------------------------");
        int result = flying.m2(100);
        System.out.println(result);
    }
}

运行测试可看到结果:


使用代理执行方法,在方法执行之前和之后我们自己加入的横切面逻辑代码也会执行,实现了切面编程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值