Proxy模式——动态代理

作者: 吃啥呀 | 来源:发表于2018-07-16 19:31 被阅读12次

java设计模式


静态代理 :一个RealSubject类对应一个Proxy类
如果有多个RealSubject,该怎么办呐?

动态代理

1.创建抽象类

public interface Subject {
    void eat() throws Exception;//抽象主题
}

2.创建真实类RealSubject——被代理的类

import java.util.Random;

public class Pig implements Subject{
    //RealSubject真实主题
    @Override
    public void eat() throws Exception {
        Thread.sleep(new Random().nextInt(1000));
        System.out.println("猪正在吃饭中......");
    }
}

3.创建事务处理器

InvocationHandler接口
public interface InvocationHandler {
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

参数:
proxy 被代理的对象(真实对象RealSubject)
method 被代理对象的方法(所哦调用真实对象的某个方法的Method对象)
args 方法的参数(调用真实对象某个方法时接受的参数)
返回:
Object 方法返回值

具体实现
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class TimeHandler implements InvocationHandler{
    private Object object;//绑定委托对象,即具体实现类的实例化对象

    public TimeHandler(Object object){
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long startTime = System.currentTimeMillis();
        System.out.println("猪开始吃饭…");
        method.invoke(object, args);
        long stopTime = System.currentTimeMillis();
        System.out.println("猪结束吃饭");
        System.out.println("猪的吃饭时间:" + (stopTime - startTime) + "毫秒!");
        return null;
    }
}

4.测试类

Proxy类——动态创建一个代理对象的类
public class Proxy implements java.io.Serializable {
    public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h) {
        //这个方法的作用:得到一个动态的代理对象
       ......
    }
}

loader 类加载器:定义了由哪个ClassLoader对象来对生成的代理对象加载
interfaces 实现接口:Intrface对象数组,表示的是将要给代理的对象提供一组什么接口,如果我提供了一组接口,它就实现该接口——就能调用该接口的方法
h InvocationHandler:表示的是当动态代理对象在调用方法时,会关联到哪个InvocationHandler对象上

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

public class Main {

    public static void main(String[] args) throws Exception {
         Pig pig = new Pig();
         InvocationHandler handler = new TimeHandler(pig);
         Class<?> cls = pig.getClass();

         Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),handler);
         subject.eat();
    }
}

5.运行结果

Main.png

动态代理&静态代理 :动态代理不需要我们去编写代理类,在程序中动态生成,而静态代理是则是我们自己编写好类

相关文章

  • 六大原则 动态代理

    参考 六大原则 代理模式 介绍了三种代理:静态代理、Proxy、cglib java 动态代理详解介绍了动态代理具...

  • Java 代理

    静态代理 动态代理 JDK 提供的Proxy CGLib cglib | GitHub 参考文章 Java的三种代理模式

  • 代理模式介绍以及jdk动态代理实现

    下一篇进阶 代理模式_利用CGLIB实现对Class动态代理 定义 代理模式(Proxy)为其他对象提供一种代理以...

  • Proxy模式——动态代理

    java设计模式 静态代理 :一个RealSubject类对应一个Proxy类如果有多个RealSubject,该...

  • Java 动态代理(1)

    代理模式即Proxy Pattern,23种常用的面向对象软件的设计模式之一。 Java的动态代理比代理的思想更像...

  • 代理模式

    代理模式(proxy):为其他对象提供一种代理以控制对这个对象的访问。 代理种类:保护代理、动态代理【iOS没有】...

  • 设计模式之代理模式

    代理模式 静态代理 动态代理 由上图代码可看到,proxy逻辑被抽象到ProxyHandler中,与业务完全解耦,...

  • Java代理

    前言 Java代理大致可以分为静态代理(static proxy),动态代理(dynamic proxy)。所谓代...

  • 面试常问的设计模式之代理模式的详细解析

    Proxy-代理模式 代理模式 代理模式: Proxy Pattern. 指为对象提供一种代理,用以控制对这个对象...

  • 代理模式(Proxy Pattern)动态代理

    原文章连接:https://www.jianshu.com/p/5dc416ea58a2 关注大神好久了,今天跟大...

网友评论

    本文标题:Proxy模式——动态代理

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