美文网首页
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中的静态代理和动态代理

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