美文网首页
设计模式(3) 代理模式 动态代理

设计模式(3) 代理模式 动态代理

作者: 风雨雾凇 | 来源:发表于2018-01-14 12:32 被阅读0次

根据上一个文章可轻松实现代理功能,但是这样做的代价是会生成许多的XxxProxy类,怎样才能消除掉这些类呢?这时我们可以使用JDK的动态代理。

  • 使用JDK提供的动态代理方案
    编写一个事务CarTimeHandler类 实现计时功能 、实现InvocationHandler接口
package cn.niriqiang.proxy;

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

/**
 * Created by fengyuwusong on 2017/8/19 15:37.
 */
public class CarTimeHandler implements InvocationHandler {
    //被代理的目标对象
    private Object target;
    long start,end;
    public CarTimeHandler(Object target) {
        this.target = target;
    }


    private void before() {
        start=System.currentTimeMillis();
        System.out.println("开车前时间:"+start);
    }

    private void after(){
        end=System.currentTimeMillis();
        System.out.println("开车后时间:"+end+".\n总耗时:"+(end-start)+"毫秒");
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        method.invoke(target);
        after();
        return null;
    }
}


再编写一个事务CarLogHandler类实现日志功能

package cn.niriqiang.proxy;

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

/**
 * Created by fengyuwusong on 2017/8/19 23:58.
 */
public class CarLogHandler implements InvocationHandler {
    ICar car;

    public CarLogHandler(ICar car) {
        this.car = car;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        method.invoke(car);
        System.out.println("记录日志");
        return null;
    }
}

则在main方法如此调用则可实现代理

package cn.niriqiang.proxy;

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

/**
 * Created by fengyuwusong on 2017/8/19 14:55.
 */
public class main {

    public static void main(String[] args) {
//        静态代理
        //        ICar car=new CarImpl();
//        Carproxy carproxy=new Carproxy(car);
//        CarLogProxy carLogProxy=new CarLogProxy(carproxy);
//        carLogProxy.run();
//        动态代理
        ICar car=new CarImpl();
        Class cls=car.getClass();
//        实现计时功能
        InvocationHandler carTimeHandler=new CarTimeHandler(car);
        car= (ICar) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),carTimeHandler);
//        实现日志功能
        InvocationHandler carLogHandler=new CarLogHandler(car);
        car=(ICar)Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),carLogHandler);
        car.run();
    }
}

结果

开车前时间:1503158582409
正在开车~~~
开车后时间:1503158583225.
总耗时:816毫秒
记录日志

相关文章

  • 设计模式之代理模式

    设计模式之代理模式 10分钟看懂动态代理设计模式(升级篇)-对这篇动态代理模式的思路整理 仿JDK实现动态代理逻辑...

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • Spring学习(五)AOP

    SpringAop使用到了了动态代理模式(有关设计模式见设计模式章节)。JDK动态代理代理的目标类必须要实现接口。...

  • Java代理模式之JDK动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 JDK动态代理是java.lang.reflect...

  • Android 代理模式(动态代理)及其原理分析

    代理模式(动态代理)及其原理分析 概念 有一种设计模式叫做代理模式,其中也用到了动态代理。动态代理就是为某一个对象...

  • retrofit源码剖析

    设计模式:动态代理

  • 理解代理模式

    原创博客地址 简介 代理模式,也叫做委托模式,分为:静态代理动态代理 代理模式也是平时比较常用的设计模式之一,代理...

  • 结构型 代理模式(文末有项目连接)

    1:什么是代理模式 2:没用代理模式时的实例 3:使用代理模式将其解耦(静态代理) 3:使用代理模式将其解耦(动态...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

  • 代理模式

    结构型设计模式 代理模式 分类 静态代理:运行之前代理类的 class 编译文件已经存在 动态代理:通过反射动态...

网友评论

      本文标题:设计模式(3) 代理模式 动态代理

      本文链接:https://www.haomeiwen.com/subject/fhskoxtx.html