动态代理是指在运行时,动态生成代理。即,代理类的字节码将在运行时生成并载入当前的ClassLoader。与静态代理相比,动态代理有很多好处。首先,不需要为真实的主题写一个形式上完全一样的封装类,假如主题接口中的方法很多,为每一个接口写一个代理方法也是非常烦人的事情,如果接口有变动,则真实主题和代理都需要修改,不利于系统的维护;其次,使用一些动态代理的生成方法甚至可以在运行时指定代理类的执行逻辑,从而大大提升系统的灵活性。
注意:动态代理使用字节码动态生成加载技术,在运行时生成并加载类。
代理模式示例代码:
1 //第一个主题 2 public interface IDBQuery { 3 4 public void query(); 5 } 6 7 public class DBQuery implements IDBQuery { 8 9 @Override 10 public void query() { 11 System.out.println("request..."); 12 } 13 14 } 15 16 public class ProxyHandler implements InvocationHandler { 17 18 private Object proxied; 19 20 public ProxyHandler(Object proxied){ 21 this.proxied = proxied; 22 } 23 24 @Override 25 public Object invoke(Object proxy, Method method, Object[] args) 26 throws Throwable { 27 //在调用具体目标对象之前,可以执行一些处理 28 29 //转调具体目标对象的方法 30 return method.invoke(proxied, args); 31 //在转调具体目标对象之后,可以执行一些功能处理 32 } 33 34 } 35 36 //第二个主题 37 public interface Subject { 38 39 public void dosomething(); 40 } 41 42 public class RealSubject implements Subject { 43 44 @Override 45 public void dosomething() { 46 System.out.println("call dosomething!!!"); 47 } 48 49 } 50 51 //调用 52 public class DynamicProxy { 53 54 public static void main(String[] args) { 55 RealSubject real = new RealSubject(); 56 Subject proxySubject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), 57 new Class[]{Subject.class}, 58 new ProxyHandler(real)); 59 proxySubject.dosomething(); 60 61 DBQuery dbQuery = new DBQuery(); 62 IDBQuery proxyIdbQuery =(IDBQuery) Proxy.newProxyInstance(IDBQuery.class.getClassLoader(), 63 new Class[]{IDBQuery.class}, 64 new ProxyHandler(dbQuery)); 65 proxyIdbQuery.query(); 66 } 67 68 }
输出结果:
1 call dosomething!!! 2 request...
拓展,可参考这位仁兄的博客
http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html
时间: 2024-10-10 23:42:46