美文网首页
Java 静态、动态代理

Java 静态、动态代理

作者: Jason_cyj | 来源:发表于2018-07-04 22:40 被阅读14次

    一 代理(Proxy)概述

    代理(Proxy)是 23种Java常用设计模式之一,提供了对目标对象(被代理对象)的间接访问方式,即可通过代理访问目标对象,以此可在目标实现的基础上增加额外的功能操作,从而满足自身的业务需求。代理实现可以分为静态代理和动态代理。

    二 静态代理

    要实现静态代理,需要满足以下两个条件:

    • 需要定义接口或者父类
    • 目标对象与代理对象二者需要实现相同的接口或者是继承相同父类。
    /**
     * 接口
     */
    interface Subject {
        void request();
    }
    /**
     * 目标对象实现Subject接口
     */
    class RealSubject implements Subject {
        public void request(){
            System.out.println("RealSubject");
        }
    }
    /**
     * 代理对象,静态代理,也实现Subject接口
     */
    class Proxy implements Subject {
        private Subject subject;
    
        public Proxy(Subject subject){
            this.subject = subject;
        }
        public void request(){
            System.out.println("begin");
            subject.request();
            System.out.println("end");
        }
    }
    /**
     * 静态代理测试实例
     */
    public class ProxyDemo {
        public static void main(String args[]) {
            RealSubject subject = new RealSubject();
            Proxy p = new Proxy(subject);
            p.request();
        }
    }
    

    由上可知,在静态代理模式中,可以在不修改目标对象的基础上,通过扩展代理类,增加额外的功能操作。但是,代理类和目标类二者要共同实现一个接口或者是共同继承某个父类,当接口增加方法,则目标类和代理类都需要维护,同时当代理类比较多,也不易维护。

    三 动态代理

    动态代理中,代理类并不是在Java代码中实现,而是在运行时期动态生成,与静态代理不同,静态代理是代理类中事先预定好的。

    /**
     * 接口
     */
    interface Subject {
        void request();
    }
    /**
     * 目标对象实现Subject接口
     */
    class RealSubject implements Subject {
        public void request(){
            System.out.println("RealSubject");
        }
    }
    /**
     * 利用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口定义代理类的实现。
     */
    public class DynamicProxyFactory {
        private Object target;
    
        public DynamicProxyFactory(Object target) {
            this.target = target;
        }
        // 生成代理对象
        public Object getProxy() {
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            Class<?>[] interfaces = target.getClass().getInterfaces();
            return Proxy.newProxyInstance(loader, interfaces,
                    new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            System.out.println("begin");
                            Object result = method.invoke(target, args);
                            System.out.println("end");
                            return result;
                        }
                    });
        }
    }
    /**
     * 动态代理测试实例
     */
    public class ProxyDemo {
        public static void main(String[] args) {
            RealSubject subject = new RealSubject();
            DynamicProxyFactory dynamicProxy = new DynamicProxyFactory(subject);
            Subject iSubject = (RealSubject)dynamicProxy.getProxy();
            iSubject.request();
        }
    }
    

    动态代理对象的生成过程由Proxy类的newProxyInstance方法实现。

    相关文章

      网友评论

          本文标题:Java 静态、动态代理

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