代理模式和java动态代理

来源:互联网 发布:oracle数据库未打开 编辑:程序博客网 时间:2024/06/03 09:26

代理模式的作用及使用场景

使用代理模式的根本目的在于:如何在不直接操作对象的情况下,对此对象进行访问?

常用的场合包括:1)延迟加载;2)在调用实际对象的方法前后加入某些业务逻辑(作用有点像spring的AOP)

类结构:



JAVA动态代理

JAVA提供了动态代理类以供用户方便地实现代理模式

public interface Subject {public void doRequest(String aa);}public class SubjectImpl implements Subject {public void doRequest(String aa) {System.out.println("do some request"+ aa);}}public class ProxyHandler implements InvocationHandler {private Object proxyObj;public ProxyHandler(Object proxy){this.proxyObj = proxy;}public Object invoke(Object proxy, Method method, Object[] args )throws Throwable {//do something before invokeSystem.out.println("do something before invoke");       //通过 method.invoke调用代理对象的方法      Object obj= method.invoke( proxyObj, args);                //打印args,其实就是调用的函数的参数              if (args!=null){                 for (int i = 0; i < args.length; i++) {                     System.out.println("args:"+args[i]);                 }              }    System.out.println("do something after invoke");return obj;}}
调用代码:

public class Client {public static void main(String[] args) {    SubjectImpl real = new SubjectImpl();       Subject proxySubject = (Subject)Proxy.newProxyInstance(Subject.class.getClassLoader(),     new Class[]{Subject.class}, new ProxyHandler(real));             proxySubject.doRequest("test");}}

输出结果:


可见,在Client的main方法中,并没有直接调用SubjectImpl对象的方法,使用java动态代理可以使我们少定义一个proxy实现类

参考文章:

http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html

0 0
原创粉丝点击