酒架厂家
免费服务热线

Free service

hotline

010-00000000
酒架厂家
热门搜索:
成功案例
当前位置:首页 > 成功案例

看一看:Java静动态代理模式示例

发布时间:2022-04-02 10:26:06 阅读: 来源:酒架厂家
Java静动态代理模式示例 作者:kuru 2011-11-17 14:32:45 开发 后端 静态代理模式中,真实角色必须是事先已经存在的,并将其作为代理对象的内部属性,并且真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀。那么,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决因环保强拆厂房有补偿吗

设计模式
1.静态代理模式
使用场合:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
涉及的角色:
抽象角色:
声明真实对象和代理对象的共同接口;

代理角色:
代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

真实角色:
代理角色所代表的真实对象政府强拆需要出具哪些手续?,是我们最终要引用的对象。
***的老师是代码,下面是本人敲的一个静态代理代码示例

Java代码 收藏代码

  1. packagecom;
  2. /**
  3. *车站接口-【抽象角色】
  4. *
  5. *@authorabing
  6. *
  7. */
  8. interfaceStation{
  9. voidsellTicks();//卖票
  10. voidtransport();//运输乘客
  11. }
  12. /**
  13. *火车站实现类-【具体角色】
  14. *
  15. *@authorabing
  16. *
  17. */
  18. classTrainStationImplimplementsStation{
  19. @Override
  20. publicvoidsellTicks(){
  21. System.out.println("TrainStationselltickets");
  22. }
  23. @Override
  24. publicvoidtransport(){
  25. System.out.println("TrainStationtransportpassenger");
  26. }
  27. }
  28. /**
  29. *该类做为火车站的一个代理直接供客户端调用-【代理角色】
  30. *
  31. *@authorabing
  32. *
  33. */
  34. classStationProxyimplementsStation{
  35. Stationsta=newTrainStationImpl();
  36. @Override
  37. publicvoidsellTicks(){
  38. sta.sellTicks();//代理类中调用真实角色的方法。
  39. }
  40. publicvoidotherOperate(){
  41. System.out.println("dosomeotherthings...");
  42. }
  43. @Override
  44. publicvoidtransport(){
  45. System.out.println("StationProxycannottransport");
  46. }
  47. }
  48. /**
  49. *客户端测试类
  50. *
  51. *@authorabing
  52. *
  53. */
  54. publicclassStaticProxyDemo{
  55. publicstaticvoidmain(String[]args){
  56. Stationstation=newStationProxy();//客户端直接操作代理类,避免了客户端与真实类的直接交涉
  57. station.sellTicks();
  58. }
  59. }

#p#

2.动态代理模式

静态代理模式中,真实角色必须是事先已经存在的,并将其作为代理对象的内部属性,并且真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀。那么,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。
动态代理必需用到以下两个类。
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。用于完成真实角色中方法的调用。(2).Proxy:该类即为动态代理类,作用类似于静态代理模式的代理类
***的老师是代码,下面是本人敲的一个动态代理代码示例

Java代码 收藏代码

  1. packagecom.proxy;
  2. importjava.lang.reflect.InvocationHandler;
  3. importjava.lang.reflect.Method;
  4. importjava.lang.reflect.Proxy;
  5. /**
  6. *车站接口-【抽象角色】
  7. *@authorabing
  8. *
  9. */
  10. interfaceStation{
  11. voidsellTicks();//卖票
  12. }
  13. /**
  14. *火车站实现类-【具体角色】
  15. *@authorabing
  16. *
  17. */
  18. classTrainStationImplimplementsStation{
  19. @Override
  20. publicvoidsellTicks(){
  21. System.out.println("TrainStationselltickets");
  22. }
  23. }
  24. /**
  25. *使用动态代理模式必须实现InvocationHandler接口,该接口中仅定义了一个方法:
  26. *invoke(Objectobj,Methodmethod,Object[]args)。
  27. *在实际使用时,***个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组
  28. *
  29. *@authorabing
  30. *
  31. */
  32. classInvocationHandlerImplimplementsInvocationHandler{
  33. Objectproxyobj;
  34. publicInvocationHandlerImpl(Objectobject){
  35. this.proxyobj=object;
  36. }
  37. @Override
  38. publicObjectinvoke(Objectobj,Methodmethod,Object[]args)
  39. throwsThrowable{
  40. System.out.println("startdoing.........");
  41. method.invoke(proxyobj,args);//调用被代理对象proxyobj的方法method,传入一个参数组args
  42. System.out.println("stopdoing.城管强拆损失谁负责........");
  43. returnnull;
  44. }
  45. }
  46. /**
  47. *客户端测试类
  48. *@authorabing
  49. *
  50. */
  51. publicclassDynamicProxyDemo{
  52. publicstaticvoidmain(String[]args){
  53. StationstationImpl=newTrainStationImpl();//将要被代理的真实对象
  54. /**
  55. *动态代理就好处在这里,不管这里是要代理什么对象,I
  56. *nvocationHandlerImpl与Proxy中代码都不必改变,
  57. *都是用下面同样的方式去产生代理对象
  58. */
  59. InvocationHandlerhandler=newInvocationHandlerImpl(stationImpl);//用InvocationHandler的实现类包装真实的被代理角色
  60. ClassLoaderloader=handler.getClass().getClassLoader();//获取当期那java程序的类装在器Classloadler
  61. Class<?>[]interfaces=stationImpl.getClass().getInterfaces();//获取被代理角色实现的所有接口
  62. /**
  63. *Proxy类是动态代理模式涉及到的另一个重要的类,该类即为动态代理类,作用类似于静态代理模式中的代理类StationProxy,
  64. *它有一个重要方法taticObjectnewProxyInstance(ClassLoaderloader,Class[]interfaces,InvocationHandlerh):返回代理类的一个实例。
  65. *其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组,传递此参数以使产生的代理对象可以当做真实类任意实现接口的子类来用,
  66. *h是调用处理器InvocationHandler。
  67. */
  68. Stationstation=(Station)Proxy.newProxyInstance(loader,interfaces,handler);
  69. station.sellTicks();//将会去执行DynamicProxy的invoke方法,完成对目标对象方法的调用
  70. }
  71. }

原文链接:http://kuru.iteye.com/blog/1261562

编辑推荐:

  1. 红帽云中Java提供综合生命周期支持
  2. 纯Java进程内缓存框架Ehcache 2.5正式发布
  3. 深入浅出Rhino:Java与JS互操作
  4. JavaScript异步编程之Jscex无创痕切入jQueryUI
  5. Java开发框架Play框架快速入门