美文网首页
Java中的静态代理和动态代理

Java中的静态代理和动态代理

作者: e小e | 来源:发表于2017-11-07 20:15 被阅读10次

先来说说代理吧.
举一个生活中常见的例子,我像要租套房子,要求大小15平方,在内环里面,独立卫生间,精装修。一般我们会去找中介,让他去找这样的房子,我只负责给钱就可以,这个中介其实就是这里提到的代理。
那什么又是静态代理和动态代理呢,静态代理是在代码里面就确定了代理类和被代理类是怎么样的关系,而动态代理是在运行时候去确定代理类和被代理类关系,可以说一个代理类可以代理所有其它对象。这样描述有点抽象,可以看一下下面两张图。
静态代理


image.png

动态代理


image.png
下面分别来说说这

静态代理

还是以刚才租房的例子为例,看看如何实现一个静态代理.
RentSubjectImpl.class

public interface RentSubjectImpl {
    void rentHouse();
}

StaticProxy.class

public class StaticProxy implements RentSubjectImpl{

    private RentSubjectImpl rentSubject;

    public StaticProxy(RentSubjectImpl rentSubject) {
        this.rentSubject = rentSubject;
    }

    @Override
    public void rentHouse() {
        System.out.println("按照要求寻找 要求大小15平方,在内环里面,独立卫生间,精装修");
        rentSubject.rentHouse();
    }
}

XiaoMing.class

public class XiaoMing implements RentSubjectImpl{
    @Override
    public void rentHouse() {
        System.out.println("交纳房租");
    }
}

最终运行test.

public void test(){
       RentSubjectImpl rentSubject = new XiaoMing();
       StaticProxy staticProxy = new StaticProxy(rentSubject);
}

动态代理

public class ProxyHandler implements InvocationHandler {

    private Object target;

    public ProxyHandler( Object target )
    {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (target instanceof RentSubjectImpl){
            System.out.println("按照要求寻找 要求大小15平方,在内环里面,独立卫生间,精装修");
        }
        return method.invoke( target, args);
    }
}

最终运行类.

public void test(){
        XiaoMing xiaoMing = new XiaoMing();
        ProxyHandler proxyHandler = new ProxyHandler(xiaoMing);
        RentSubjectImpl rentSubject = (RentSubjectImpl) Proxy.newProxyInstance(xiaoMing.getClass().getClassLoader(),xiaoMing.getClass().getInterfaces(),proxyHandler);
        rentSubject.rentHouse();
}

最后我们可以看到动态代理其实不光可以代理XiaoMing.class,任何类都可以通过Proxy.newProxyInstance进行代理,最终代理的执行是交给InvocationHandler。(InvocationHandler里面调用invoke方法)

相关文章

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • java的动态代理详解(javassist,cglib)

    俗话说:Coder不知动态代理,走在路上没人理!!!所以本文尝试说明白java代理模式,代理中的静态代理和动态代理...

  • 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP

    文章目录 Java的静态代理 静态代理的优缺点 ABAP的静态代理 Spring AOP的动态代理 JDK动态代理...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • Java动态代理从入门到原理再到实战

    目录 前言 什么是动态代理,和静态代理有什么区别 Java动态代理的简单使用 Java动态代理的原理解读 动态代理...

  • Java基础系列-静态代理和动态代理

    原创文章,转载请标注出处:《Java基础系列-静态代理和动态代理》 1、动态代理(Dynamic Proxy) 代...

  • 代理简记

    Java静态代理 委托类和代理类,实现共同接口 共同接口: 委托类: 代理类: 测试结果: Java动态代理 通过...

  • 静态代理、动态代理

    代理分为静态代理和动态代理 按照代理创建的时期,可以分为静态代理和动态代理: (1) 静态代理:由程序员或者...

  • JAVA动态代理的实现方式

    1. 静态代理VS动态代理 代理类可以增强被代理对象的方法。可分为静态代理和动态代理。 1.1 静态代理 静态代理...

网友评论

      本文标题:Java中的静态代理和动态代理

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