【Java笔记(22)】利用反射实现动态代理模式

一、核心代码

 * 使用静态方法生产一个代理对象(Proxy)* 				public static Object newProxyInstance
 * 				(ClassLoader loader,
 *            	Class<?>[] interfaces,
 *              InvocationHandler h) {}
 *
 * 接口:		InvocationHandler ,里面有一个 invoke()方法,当代理对象调用接口
 * 		 		里面的方法(spend())时会自动的调用invoke();
 * 调用方法:    public Object invoke(Object proxy,Method method,Object[]args)throws Throwable;
 *              该方法是在 InvocationHandler 接口里面。
 * 实现流程:
 *          	1、代理类需要实现 InvocationHandler接口
 *          	2、代理类需要有一个Object属性:private Object target;
 *          	3、代理对象需要通过Proxy.newProxyInstance()获得
 *         	 	4、最终客户端只需要传递真实业务类对象即可
 * 	

二、完整代码

1、DynamicProxyMode.java

package reflect.proxy;

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

/**
 * 使用静态方法生产一个代理对象(Proxy):    public static Object newProxyInstance(ClassLoader loader,
 *                                           Class<?>[] interfaces,
 *                                           InvocationHandler h) {}
 *
 * 接口:InvocationHandler ,里面有一个 invoke()方法,当代理对象调用接口里面的方法(spend())时会自动的调
 *                          用invoke();
 * 调用方法:    public Object invoke(Object proxy,Method method,Object[]args)throws Throwable;
 *              该方法是在 InvocationHandler接口里面。
 * 结合反射实现的动态代理设计模式
 * @ClassName: DynamicProxyMode
 * @Author: Xlu
 * @Date: 2020-06-15 9:48
 * @Version 11
 **/
public class DynamicProxyMode {
    public static void main(String[] args) {
        //通过
        IMessage msg = (IMessage) new DynamicProxy().bind(new MessageReal());

        //代理对象调用真实业务里的方法时,会去调用代理类里面的invoke()方法
        msg.spend();
    }
}

/**
 * 动态代理类,实现了 InvocationHandler接口
 * @Author Xlu
 * @Date 2020-06-15 10:58
 * @ClassName DynamicProxy
 * @Version 11
 **/
class DynamicProxy implements InvocationHandler {
    private Object target;

    public boolean connect() {
        System.out.println("【动态代理】连接成功");
        return true;
    }

    public void close() {
        System.out.println("【动态代理】连接关闭");
    }

    /**
     * 绑定真实业务与代理业务
     * @Author Xlu
     * @Date 11:08 2020-06-15
     * @param target 真实业务对象
     * @return java.lang.Object 代理业务对象
    */
    public Object bind(Object target) {
        this.target=target;
        return  Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    /**
     * invoke 处理代理的类对象
     * @Author Xlu
     * @Date 11:01 2020-06-15
     * @param proxy 需要代理的类
     * @param method 其中的方法
     * @param args 里面的参数
     * @return java.lang.Object 真实业务返回的参数
    */
    @Override
    public Object invoke(Object proxy , Method method , Object[] args) throws Throwable {
        System.out.println("执行方法");
        Object returnObj = null;
        if (this.connect()) {
            returnObj=method.invoke(this.target , args);
            this.close();
        }
        return returnObj;
    }

}

2、IMessage.java

package reflect.proxy;

/**
 * @ClassName: IMessage
 * @Author: Xlu
 * @Date: 2020-06-15 10:54
 * @Version 11
 **/
interface IMessage {
    /**
     * 静态代理接口方法
     *
     * @return void
     * @Author Xlu
     * @Date 9:26 2020-06-15
     */
    public void spend();
}

3、MessageReal.java

package reflect.proxy;

/**
 * 真实业务类
 *
 * @Author Xlu
 * @Date 2020-06-15 9:27
 * @ClassName StaticProxyReal
 * @Version 11
 **/
class MessageReal implements IMessage {
    @Override
    public void spend() {
        System.out.println("【真实业务】");
    }
}

三、运行结果

执行方法
【动态代理】连接成功
【真实业务】
【动态代理】连接关闭
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

「已注销」

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

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

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

打赏作者

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

抵扣说明:

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

余额充值