Java 静态、动态代理

2018-07-04  本文已影响14人  Jason_cyj

一 代理(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方法实现。

上一篇下一篇

猜你喜欢

热点阅读