JAVA 动态代理

来源:互联网 发布:法丽达官网 只有淘宝店 编辑:程序博客网 时间:2024/06/06 20:27

JAVA 动态代理

采用静态代理的话,每一个方法指定要代理的方法都需要自己再写一遍,当方法过多的时候就很不方便,于是采用动态代理,动态代理,不具体指定某一个需要代理的方法,利用了JAVA反射机制,只管调用方法,会自动代理。

1.抽象角色

接口,列出需要被代理的方法

interface Subject{     void request();     void Show(String name);}

2.真实角色

实现真实操作的类,实现接口

class RealSubject implements Subject{    RealSubject(){};    public void request(){        System.out.println("From the Real Subject");    }    public void Show(String name){        System.out.println(name);    }}

3.动态代理角色

在真实操作的前后,附加一些操作。动态代理需要实现InvocationHandler接口

class ProxySubject implements InvocationHandler {    private RealSubject realSubject;//真实对象去执行真实的操作    ProxySubject(){};    ProxySubject(RealSubject realSubject){        this.realSubject=realSubject;    }    //就算是同名,也不会调用这个函数    public void request(){        System.out.println("就算是同名,也不会调用这个函数");    }    public void preRequest(){//在对真实对象操作之前,代理附加的操作       System.out.println("Pre Request");    }    public void postRequest(){//在对真实对象操作完成之后,代理附加的操作        System.out.println("Post Request");    }    //实现接口,利用反射机制,实现动态代理,会自动执行这个函数    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("代理类自动代理");        //打印出对象,及需要调用的方法和参数        System.out.println("Subject:"+realSubject);        System.out.println("Method:"+method);        System.out.println("args:"+args);        preRequest();        method.invoke(realSubject,args);//调用真实角色及其方法        postRequest();        return null;    }}

4.测试

主要实例化一个动态代理实例,然后通过实例调用方法。弄清楚构造参数。

public class JavaTest {    public static void main(String arg[]){        RealSubject realSubject=new RealSubject();//真实被代理的对象        InvocationHandler ds = new ProxySubject(realSubject);//创建调用处理器        Class cls=realSubject.getClass();//创建要被代理的 类        //参数说明,需要类的类加载器,类的接口,一个调用处理器        Subject subject=(Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds);//创建一个动态代理类的实例,只支持接口代理        subject.request();//通过代理实例调用方法        subject.Show("Call Show()");    }}

运行结果

代理类自动代理Subject:RealSubject@5e2de80cMethod:public abstract void Subject.request()args:nullPre RequestFrom the Real SubjectPost Request代理类自动代理Subject:RealSubject@5e2de80cMethod:public abstract void Subject.Show(java.lang.String)args:[Ljava.lang.Object;@1d44bcfaPre RequestCall Show()Post Request

0 0
原创粉丝点击