(Java)动态代理 InvocationHandler 和 Invoke

一、基本概念

Java 动态代理 有两个重要的类和接口InvocationHandler(接口)和Proxy(类),这一个类Proxy和接口InvocationHandler是我们实现动态代理的核心;

InvocationHandler接口是proxy代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都有一个关联的调用处理程序;

在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke方法

每一个动态代理类的调用处理程序都必须实现InvocationHandler接口,并且每个代理类的实例都关联到了实现该接口的动态代理类调用处理程序中,当我们通过动态代理对象调用一个方法时候,这个方法的调用就会被转发到实现InvocationHandler接口类的invoke方法来调用

二、示例一

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//定义接口
interface Shopping {
    String  buy();
}
//定义接口实现类 Client
class Client implements Shopping {
    public String buy() {
        System.out.println("我想买这件商品");
        return "那就买它!!!";
    }
}
//代理操作类
class DynamicProxy implements InvocationHandler {

    private Object target = null;

    DynamicProxy(Object target) {
        this.target = target;
    }

    /**
     * 代理方法逻辑
     *
     * @param proxy  代理对象
     * @param method 调度方法
     * @param args   调度方法参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理前");
        Object invoke = method.invoke(target, args);
        System.out.println("代理后");
        return invoke;
    }
}

public class ProxyTest {
    public static void main(String[] args) {
        Shopping client = new Client();
        //实例化代理操作类
        DynamicProxy dyProxy = new DynamicProxy(client);
        //获取动态代理对象 shop
        Shopping shop = (Shopping) Proxy.newProxyInstance(Shopping.class.getClassLoader(), new Class[]{Shopping.class}, dyProxy);
        System.out.println(shop.buy());
    }
}

在这里插入图片描述

代码执行的流程就是
(1)获取动态代理对象 shop
(2)调用shop 的方法 buy ,这会转发到 DynamicProxyinvoke方法内调用,这里的 invoke 实际上就是对转发的方法的进行的操作,这里的操作时继续转发 method.invoke ,当然还可以有其他的操作。

三、示例二

在这里插入图片描述
这里的invoke就是一个封装参数,然后转发到Executor的操作

四、method.invoke

method.invoke 实现的是对方法的转发执行
示例可 点击参考

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值