没事的时候翻看lang.reflect包下的代码,发现有两部分内容:涉及反射和动态代理。 
很多地方都可以看到动态代理的影子,只是一直没仔细看下。

在学习之前,先提出几个问题,带着问题来看代码:

1.什么是动态代理? 
2.为什么使用动态代理? 
3.使用它有哪些好处? 
4.哪些地方需要动态代理?

--------------------分隔线-----------------------------

和动态代理有关的有两个类 
1.interface InvocationHandler 
Object invoke(Object proxy, Method method, Object[] args) 
只这一个方法,后面再说

2.class Proxy 
真正表示动态代理的类,提供两个静态方法:

Class<?> getProxyClass(ClassLoader loader, Class<?>[] interface) 
用来产生代理类,参数要提供interface数组,它会生成这些interface的“虚拟实现”, 
用来冒充真实的对象。

Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 
产生代理对象,多了InvocationHandler参数(只是InvocationHandler接口的实现类), 
它与代理对象关联,当请求分发到代理对象后,会自动执行h.invoke(...)方法, 
invoke方法就是我们用来做N多事情的地方 -_-。

--------------------分隔线-----------------------------

看完上面的代码,大致明白动态代理的含义: 
A接口有c方法,类B实现A接口,原本应该是执行B类中的c方法,可现在不这样做; 
我声明产生B类的代理类B',由它来冒充B类的“兄弟”并“实现”A接口, 
对外界来说B'应该也有c方法,可当真正调用它的时候, 
它会去执行与它关联InvocationHandler的invoke()方法, 
在这个方法里面你可以做很多事情。这样,这个请求就被“代理”到其它地方去了。

下面是根据我的理解画的一个说明图 

--------------------分隔线-----------------------------

引用网上的一个例子来说明问题(有部分改动,转载自:http://callan.iteye.com/blog/161806) 
真实的接口:

Java代码  
  1. public interface Hello {
  2. void sayHello(String to);
  3. void print(String p);
  4. }

它的真实实现类:

Java代码  
  1. public class HelloImpl implements Hello {
  2. public void sayHello(String to) {
  3. System.out.println("Say hello to " + to);
  4. }
  5. public void print(String s) {
  6. System.out.println("print : " + s);
  7. }
  8. }

在这里生成与代理类相关联的InvocationHandler对象

Java代码  
  1. public class LogHandler implements InvocationHandler {
  2. private Object dele;
  3. public LogHandler(Object obj) {
  4. this.dele = obj;
  5. }
  6. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  7. doBefore();
  8. //在这里完全可以把下面这句注释掉,而做一些其它的事情
  9. Object result = method.invoke(dele, args);
  10. after();
  11. return result;
  12. }
  13. private void doBefore() {
  14. System.out.println("before....");
  15. }
  16. private void after() {
  17. System.out.println("after....");
  18. }
  19. }

最后是测试类:

Java代码  
  1. public class ProxyTest {
  2. public static void main(String[] args) {
  3. HelloImpl impl = new HelloImpl();
  4. LogHandler handler = new LogHandler(impl);
  5. //这里把handler与impl新生成的代理类相关联
  6. Hello hello = (Hello) Proxy.newProxyInstance(impl.getClass().getClassLoader(), impl.getClass().getInterfaces(), handler);
  7. //这里无论访问哪个方法,都是会把请求转发到handler.invoke
  8. hello.print("All the test");
  9. hello.sayHello("Denny");
  10. }
  11. }

这里是输出结果:

Java代码  
  1. before....
  2. print : All the test
  3. after....
  4. before....
  5. Say hello to Denny
  6. after....

--------------------分隔线-----------------------------

最后试着来回答之前提出的问题: 
1.什么是动态代理? 
一种用于转发请求,进行特殊处理的机制,“动态”应该指的是“运行期”。 
2.为什么使用动态代理? 
可以对请求进行任何处理(如事务,日志等,这都是网上说的,我当然可以做任何处理) 
3.使用它有哪些好处? 
如上 
4.哪些地方需要动态代理? 
不允许直接访问某些类;对访问要做特殊处理等,我只能想到这些。

--------------------分隔线-----------------------------

其它一些想法:

1.如果想声明产生B类的代理类,那个B类必须要实现接口,如果没有接口, 
代理类就不能伪装成B类的“兄弟”,也就没有存在的意思, 
其实也可以伪装成B类的“孩子”,对外他们有共同的接口,可以这样做吧?

2.当请求代理类的方法时,这个请求会被转到执行与代理类关联InvocationHandler 
的invoke方法。那InvocationHandler到底是什么?对它的理解可以是这样: 
它用来处理方法的调用,实现类也有同样的意义;与代理类对象相关联则表示, 
它就是负责处理代理类应该有的动作,把所有的方法请求分发到invoke这个方法上。

--------------------分隔线----------------------------- 
学习后总结,既可以全面地观察分析,又能加深印象。 
如果我的理解有误,别人的指证会对我产生积极影响。 
如果我的理解正确,帮助其它人理解是我的荣幸。 
初学者,请多多指教。

转载于:https://www.cnblogs.com/smilesmile/p/3822285.html

java动态代理学习笔记相关推荐

  1. JAVA 动态代理学习记录

    打算用JAVA实现一个简单的RPC框架,看完RPC参考代码之后,感觉RPC的实现主要用到了两个方面的JAVA知识:网络通信和动态代理.因此,先补补动态代理的知识.---多看看代码中写的注释 参考:Ja ...

  2. Java_JDK动态代理学习笔记

    昨天被问了个问题,问题的大意是这样的:为什么 Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, Invoc ...

  3. JDK动态代理学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> 昨天被问了个问题,问题的大意是这样的:为什么 Proxy.newProxyInstance(ClassLoader loade ...

  4. Java动态代理InvocationHandler和Proxy学习笔记

    java动态代理机制中有两个重要的类和接口InvocationHandler(接口)和Proxy(类),这一个类Proxy和接口InvocationHandler是我们实现动态代理的核心: 1.Inv ...

  5. java 动态代理深度学习(Proxy,InvocationHandler)

    http://hi.baidu.com/malecu/item/9e0edc115cb597a1feded5a0 http://www.iteye.com/topic/683613 http://bl ...

  6. java/android 设计模式学习笔记(6)---适配器模式

    这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...

  7. java/android 设计模式学习笔记(8)---桥接模式

    这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...

  8. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  9. Java动态代理的实现

    动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. ...

  10. Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP

    Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP xBird 原创  (参与分:36,专家分:90)   发表:2004-9-3 上午9:37   版本:1.0   阅读:160 ...

最新文章

  1. Excel制作带勾的方框
  2. BT5 设置Ubuntu主题和字体
  3. 如何切换 SVN 用户名
  4. java 星期几、得周一、得周日、上周、下周、相差、日期工具类
  5. u-boot之autoconf.mk解析
  6. java笔记:熟练掌握线程技术---基础篇之解决资源共享的问题(中)--前篇
  7. python UI自动化(一)
  8. xshell网站打不开
  9. 关于Pandownload一些功能的挖掘
  10. 没有这个传奇工程师,就没有今天的Windows
  11. 【可见光室内定位】(三)基于图像传感器CMOS的可见光室内定位技术
  12. ffmpeg视频转码压缩
  13. 免费截图工具PicPick 2.1.2绿色版
  14. PyTorch学习笔记(19) ——NIPS2019 PyTorch: An Imperative Style, High-Performance Deep Learning Library
  15. 好玩的手机淘宝社群,发单初体验
  16. 计算机应用基础在线试题,计算机应用基础试题.DOC
  17. iOS 冰与火之歌 - 利用 XPC 过 App 沙盒
  18. 不会PS图片怎么批量调色
  19. Flask上下文管理源码--亲自解析一下
  20. TX2安装配置keras环境

热门文章

  1. Oracle 基本函数-数值、字符、 Instr()、日期、转换、SQL 操作符、trunc 截断
  2. Docker 部署启动 Spring boot 项目
  3. 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_4 Mybatis中使用Dao实现类的执行过程分析-查询方法...
  4. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_6_Stream流中的常用方法_count...
  5. 基于Lua插件化的Pcap流量监听代理
  6. 原生和jQuery的ajax用法
  7. eclipse中遇到的小问题
  8. 【转】高性能web开发
  9. 12.C# 接口和抽象类的区别
  10. Java参数传递对象引用传递失效