Java设计模式---代理模式(二)---动态代理
2016-11-28 18:17
435 查看
动态代理
动态代理和代理模式实质是一样的,只是要更加灵活。
代理模式请见本博客另一篇文章 ”Java设计模式---代理模式(一)“
例、
房东接口:
此外,还可以判断方法名,可以修改方法内容
或者也可以将InvocationHandler写到其他地方
1、
动态代理和代理模式实质是一样的,只是要更加灵活。
代理模式请见本博客另一篇文章 ”Java设计模式---代理模式(一)“
例、
房东接口:
package cn.hncu.pool.day2.proxy.demo1; public interface IRenter { public void rent(int i); }房东:
package cn.hncu.pool.day2.proxy.demo1; public class Renter implements IRenter{ @Override public void rent(int i) { System.out.println("给你"+i+"个房间,请交500元!"); } @Override public String toString() { System.out.println("Renter:你好,我是房东,房子请不要搬走..."); return "Renter:你好,我是房东,房子请不要搬走..."; } }客户:
package cn.hncu.pool.day2.proxy.demo1; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { final IRenter r = new Renter();//被代理的对象 //r.rent(); Object obj = Proxy.newProxyInstance( Client.class.getClassLoader(), new Class[]{IRenter.class}, new InvocationHandler() { @Override//proxy是代理后的对象(等价于返回的obj), method就是类反射中的方法对象, args是执行method方法所需的参数 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("我是中介,收点钱......."); Object oo= method.invoke(r, args); //r.xxx(args)---放行 System.out.println("欢迎下次再来找我中介....."); return oo; } }); //上一句返回的obj就是代理后的对象 IRenter rr = (IRenter) obj; rr.rent(3); } }上面这个客户代码中客户的类加载器Client.class.getClassLoader()必须要和被代理人的接口的class集(new Class[]{IRenter.class})处于相同的生存空间,否则无效
此外,还可以判断方法名,可以修改方法内容
Object obj = Proxy.newProxyInstance( Client2.class.getClassLoader(), new Class[]{IRenter.class}, new InvocationHandler() { @Override//proxy是代理后的对象(等价于返回的obj), method就是类反射中的方法对象, args是执行method方法所需的参数 public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { Object oo = null; if(method.getName().equals("rent")){ <span style="white-space:pre"> </span>System.out.println("我是中介,收点钱......."); <span style="white-space:pre"> </span>oo= method.invoke(r, args); //r.xxx(args)---放行 <span style="white-space:pre"> </span>System.out.println("欢迎下次再来找我中介....."); }else{ oo= method.invoke(r, args);//放行 } return oo; } });
或者也可以将InvocationHandler写到其他地方
1、
package cn.hncu.pool.day2.proxy.demo2; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; public class ProxyDemo2 { public static void main(String[] args) { Object proxiedObj = Proxy.newProxyInstance( ClassLoader.getSystemClassLoader(), new Class[]{List.class}, new A()); List list = (List)proxiedObj; list.add(100); list.add("abc"); System.out.println(list.size()); System.out.println(list.get(1)); } static class A implements InvocationHandler{ private List list = new ArrayList(); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("您现在执行的是"+method.getName()+"方法..."); return method.invoke(list, args); } } }2、
package cn.hncu.pool.day2.proxy.demo3; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyUtil implements InvocationHandler { private Object srcObj = null; public ProxyUtil(Object srcObj){ this.srcObj = srcObj; } public static Object getProxy(Object srcObj){ Object obj = Proxy.newProxyInstance( ProxyUtil.class.getClassLoader(), srcObj.getClass().getInterfaces(), new ProxyUtil(srcObj) ); return obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("在工具类中被拦截......."); Object returnObj = method.invoke(srcObj, args); System.out.println("在工具类中拦截之后......."); return returnObj; } }
相关文章推荐
- Java设计模式-动态代理研究分享
- Java设计模式Proxy之动态代理
- 代理设计模式之(静态代理+Java自身提供的动态代理机制)
- java设计模式之动态代理
- [转]转个经典的帖子:说故事学设计模式之-Java动态代理模式
- java动态代理设计模式
- 学习:java设计模式—动态代理模式
- Java 设计模式之动态代理
- Java设计模式-----Proxy模式(动态代理)
- java设计模式---动态代理(简单笔记)
- -java 动态代理设计模式
- 学习:java设计模式—动态代理模式
- 使用自动生成java文件和自动编译的动态代理模式-马士兵设计模式教程
- java设计模式之动态代理模式!
- java设计模式之动态代理
- 设计模式:用Java动态代理实现AOP
- java设计模式—动态代理模式
- java 设计模式之四-代理模式 java静态代理和动态代理
- 类代理java设计模式---动态代理(简单笔记)
- 动态代理(JAVA设计模式)