重温java知识(三十五、反射机制之十三:反射与代理设计模式)

静态代理设计模式由于采用硬编码的形式,代理类不具备通用性,这样就会造成大量的重复代码,为了得到统一的代理支持,可以基于动态代理设计模式完成。

动态代理设计模式的最大特点是可以同时为若干个功能相近类提供统一的代理支持,但是需要定义一个公共的代理类。

需要使用到的接口和类

  • java.lang.reflect.InvocationHandler
  • java.lang.reflect.Proxy

1、实现动态代理设计模式的例子:

package com.mydemo;

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

public class ReflectDemo {

    public static void main(String[] args) throws Exception {

        IMessage iMessage = (IMessage) new MyProxy().bind(new MessageReal());

        iMessage.send();

    }
}

interface IMessage {
    public void send();
}

class MessageReal implements IMessage {
    @Override
    public void send() {
        System.out.println("【发送消息】------");
    }
}

// 代理类
class MyProxy implements InvocationHandler {

    // 真实业务对象
    private Object target;

    /**
     * 进行真实业务对象与代理业务对象之间的绑定处理
     *
     * @param target 真实业务对象
     * @return Proxy生成的代理业务对象
     */
    public Object bind(Object target) {
        // 保存真实对象
        this.target = target;

        // 依据真实对象的类加载、实现接口以及代理调用类(InvocationHandler)动态创建代理对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                this);
    }

    /**
     * 代理方法
     *
     * @return
     */
    public boolean connect() {
        System.out.println("【消息代理】进行消息发送通道的连接");
        return true;
    }

    // 代理方法
    public void close() {
        System.out.println("【消息代理】关闭消息通道");
    }

    /**
     * 方法覆写
     *
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        // 真实业务处理结果
        Object returnData = null;

        // 通道是否连接
        if (this.connect()) {
            // 调用真实业务
            returnData = method.invoke(this.target, args);

            // 通道关闭
            this.close();
        }

        // 返回执行结果
        return returnData;
    }
}

运行结果:
【消息代理】进行消息发送通道的连接
【发送消息】------
【消息代理】关闭消息通道
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值