博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dynamic Proxy (动态代理模式)
阅读量:5866 次
发布时间:2019-06-19

本文共 1676 字,大约阅读时间需要 5 分钟。

动态代理(运行期行为)主要有一个 Proxy类 和一个 InvocationHandler接口

动态代理角色:

1. 抽象主题角色

2. 真实主题角色(实现了抽象主题接口)

3. 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法)

Proxy 要调用 newProxyInstance方法

 

代码演示:

 

1.抽象主题角色 SubjectDemo.java

 

[java]
  
  1. package com.dynamicproxy ;  
  2.   
  3. public interface SubjectDemo  
  4. {  
  5.     public void request() ;  
  6. }  

 

2. 真实主题角色 RealSubjectDemo.java

 

[java]
  
  1. package com.dynamicproxy ;  
  2.   
  3.   
  4. public class RealSubjectDemo implements SubjectDemo  
  5. {  
  6.     public void request()  
  7.     {  
  8.         System.out.println("实现了某请求") ;  
  9.     }  
  10. }  

 

3. 动态代理主题角色 DynamicProxySubjectDemo.java

 

[java]
  
  1. package com.dynamicproxy ;  
  2.   
  3. import java.lang.reflect.InvocationHandler ;  
  4. import java.lang.reflect.Method ;  
  5.   
  6.   
  7. public class DynamicProxySubjectDemo implements InvocationHandler  
  8. {  
  9.     private Object sub ;  
  10.   
  11.     public DynamicProxySubjectDemo(Object obj)  
  12.     {  
  13.         this.sub = obj ;  
  14.     }  
  15.   
  16.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  
  17.     {  
  18.         System.out.println("before"+method) ;  
  19.   
  20.         method.invoke(sub, args) ;//真实的调用方法操作  
  21.   
  22.         System.out.println("after"+method) ;  
  23.   
  24.         return null ;  
  25.   
  26.     }  
  27.   
  28.   
  29. }  

4.客户端 Client.java

 

[java]
  
  1. package com.dynamicproxy ;  
  2.   
  3. import java.lang.reflect.InvocationHandler ;  
  4. import java.lang.reflect.Proxy ;  
  5.   
  6. public class Client  
  7. {  
  8.     public static void main(String[] args)  
  9.     {  
  10.         RealSubjectDemo rsd = new RealSubjectDemo() ;  
  11.   
  12.         InvocationHandler handler = new DynamicProxySubjectDemo(rsd) ;  
  13.          
  14.         Class<?> classType = handler.getClass() ;  
  15.           
  16.         // classType.getClassLoader() 动态代理类的类加载器  
  17.         //rsd.getClass().getInterfaces() 代理类要实现的接口列表  
  18.         //handler 指派方法调用的调用处理程序  
  19.         SubjectDemo sd = (SubjectDemo)Proxy.newProxyInstance(classType.getClassLoader(), rsd.getClass().getInterfaces(), handler ) ;  
  20.           
  21.         //这行代码一执行 转到 InvocationHandler handler = new DynamicProxySubjectDemo(rsd)  
  22.          //执行invoke方法  
  23.         sd.request() ;  
  24.     }  
  25. }  

转载地址:http://csynx.baihongyu.com/

你可能感兴趣的文章
集群调度框架的架构演进之路
查看>>
网络安全 | 教你三招,远离WannaCry
查看>>
集装箱式数据中心:购买或租赁?
查看>>
WannaCry勒索蠕虫下的工控安全预警
查看>>
“大帐篷”模式是如何改变OpenStack的?
查看>>
云服务器 ECS 镜像迁移:应用迁云之镜像迁移-(4)迁移流程和实践方法
查看>>
【商汤科技23篇论文横扫CVPR】林达华教授重磅揭秘冠军论文
查看>>
黑客公布无数种攻击 Windows 的方法,对我们有什么影响
查看>>
加拿大警方是怎样获得黑莓加密秘钥的?
查看>>
《Android和PHP开发最佳实践》一2.9 Android动画效果
查看>>
IBM与宝马构建云端合作 接入沃森物联网
查看>>
雅虎遗留的“阿里他爸”身价涨到600亿美元 马云有钱回购吗?
查看>>
台北光伏电站太阳能电池板疑过热自燃 详因待查明
查看>>
在阿里云容器服务上,轻松搭建Concourse CI
查看>>
移动互联网的下一个红海将会在物联网时代下爆发
查看>>
大数据量化用户体验
查看>>
OpenStack巨头Mirantis2015年业务增长了四倍
查看>>
光纤计算题:Pure + 思科 = 端到端NVMe
查看>>
一百天,一场修行,要不试试?
查看>>
微软确认裁员300多人,主要波及雷德蒙德总部
查看>>