Java动态代理学习1——静态代理-阿里云开发者社区

开发者社区> 科技探索者> 正文

Java动态代理学习1——静态代理

简介:
+关注继续查看

一、代理模式


代理模式是常用的java设计模式,特征是代理类委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。

代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 

 

按照代理的创建时期,代理类可以分为两种:

静态代理:由程序员创建或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。 
动态代理:在程序运行时运用反射机制动态创建而成。

 

 

二、单个静态代理

 


  1. public interface CountDao  
  2. {  
  3.     // 查看账户方法  
  4.     public void queryCount();  
  5. }  
  6.  
  7. public class CountDaoImpl implements CountDao  
  8. {  
  9.     public void queryCount()  
  10.     {  
  11.         System.out.println("查看账户方法...");  
  12.     }  
  13. }  
  14.  
  15. public class CountTrancProxy implements CountDao  
  16. {  
  17.     private CountDao countDao;  
  18.  
  19.     public CountProxy(CountDao countDao)  
  20.     {  
  21.         this.countDao = countDao;  
  22.     }  
  23.  
  24.     @Override 
  25.     public void queryCount()  
  26.     {  
  27.         System.out.println("tranc start");  
  28.         countDao.queryCount();  
  29.         System.out.println("tranc end");  
  30.     }  
  31. }  
  32.  
  33. public class TestCount  
  34. {  
  35.     public static void main(String[] args)  
  36.     {  
  37.         CountTrancProxy countProxy = new CountTrancProxy(new CountDaoImpl());  
  38.         countProxy.updateCount();  
  39.     }  

tranc start
查看账户方法...
tranc end

 

三、多个静态代理

在上面代码的基础上新增了

 


  1. public class CountLogProxy implements CountDao  
  2. {  
  3.     private CountDao countDao;  
  4.  
  5.     public CountLogProxy(CountDao countDao)  
  6.     {  
  7.         this.countDao = countDao;  
  8.     }  
  9.  
  10.     @Override 
  11.     public void queryCount()  
  12.     {  
  13.         System.out.println("Log start");  
  14.         countDao.queryCount();  
  15.         System.out.println("Log end");  
  16.     }  

调用代码就变成了

 


  1. //  体现了聚合的思想,代理之间的组合  
  2. public static void main(String[] args)  
  3. {  
  4.     CountTrancProxy trancProxy = new CountTrancProxy(new CountDaoImpl());  
  5.     CountLogProxy logPro = new CountLogProxy(trancProxy);  
  6.     logPro.queryCount();  

Log start
事务处理之前
查看账户方法...
事务处理之后
Log end

 

四、总结

其实可以用代理类可以用继承或实现接口两种方式达到代理的效果,但是当多个代理类需要相互组合的时候,继承就不灵活了,需要不断重写代理类,而实现接口的方式就十分容易通过的聚合实现代理类之间的组合。

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1066829如需转载请自行联系原作者


woshixuye111

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java之Nginx静态资源部署
  Java之Nginx静态资源部署,Nginx 是一款高性能的 http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师伊戈尔·西索夫(Igor Sysoev)所开发,官方测试 nginx 能够支支撑 5 万并发链接,并且 cpu、内存等资源消耗却非常低,运行非常稳定。
1202 0
推动量子计算与 AI 融合,飞桨成为中国首个支持量子机器学习的深度学习平台
推动量子计算与 AI 融合,飞桨成为中国首个支持量子机器学习的深度学习平台
35 0
从 pingcap tidb 学习使用静态检查工具提升代码质量
今天想跟大家简单介绍一下如何使用一些 golang 的静态代码检查工具来提升代码质量! 此博客在 GitHub 上公开发布. 如果您有任何问题或疑问,请在此处打开一个 issue。 简介 从去年接触到 TiDB 就开始尝试在社区帮忙修复一些简单的 Bug。最近,我在阅读代码的过程中发现 TiDB 的代码库中有大量的没有必要的类型转换,我就用 GoLand 分析检查出大部分的无效的类型转化, 然后提了一个 PR (CEO 半夜 review 代码,哈哈哈)修复。在这个 PR 中 zz-jason 大神 评论希望能够通过静态检查工具来检测无效的类型转换。 我经过一些研究,决定使用 uncon
26 0
IDA反汇编/反编译静态分析iOS模拟器程序(四)反汇编的符号信息与改名
首先看看windows IDA和xcode的反汇编有什么不同。因为不确定直接分析UIKit的代码会不会有法律问题,还是自己写个例子吧。分析UIKit的时候因为没有完整的debugging symbols,所以得到的反汇编信息会比自己写的代码较少。
855 0
spring源码学习【准备】之jdk动态代理和cglib动态代理的区别和性能
一:区别:---->JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。--->JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
925 0
JSP-讲解(生成java类、静态导入与动态导入)
一、JSP技术简介 JSP是Java Server Page的缩写,它是Servlet的扩展,它的作用是简化网站的创建和维护。 JSP是HTML代码与Java代码的混合体。 JSP文件通常以JSP或JSPX的扩展名。
1138 0
改善C#程序的157个建议——建议33学习笔记:避免在泛型类型中声明静态成员
改善C#程序的157个建议——建议33学习笔记:避免在泛型类型中声明静态成员
30 0
IDA反汇编/反编译静态分析iOS模拟器程序(五)F5反编译
反编译是IDA最让人振奋的功能,它的本质是IDA的一个插件,不过会被当做hex-rays的另一个产品。既然是产品,那当然就另外收费,demo版是没有的。
1068 0
5489
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载