关键词搜索

源码搜索 ×
×

(Java)动态代理 InvocationHandler 和 Invoke

发布2020-04-27浏览1958次

详情内容

一、基本概念

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 实现的是对方法的转发执行
    示例可 点击参考

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载