很生动地通过故事讲明白了Java动态代理这么个事,很棒:

为什么需要动态代理:人们希望在运行时动态修改类,但是,Java一个类一旦被装入方法区,就没法动态修改已经编译好的类了

解决方案:已经被加载或者正在运行的类既然不能被修改,就需要运行时动态生成一个代理类,达到“运行时动态修改类”的目的。

代理类是基于原来的类生成的新的类,具有运行时需要的功能,比如日志记录、事务支持、权限控制等。

如何实现功能的动态添加:

在看head first in Java时,有讲过接口的使用原则,符合has-a关系时使用接口,像是一个,当需要使用行为时使用接口,比如我想使用钢琴的发声功能,那我只需要实现钢琴的接口,接口里面有发声的功能,我是个人,我可以借助钢琴的接口发出钢琴的声音,但我不是钢琴,我是人。OK

所以在运行时需要动态添加的行为都可以认为是has-a关系,这样,新的类通过代理接口,就可以具有想要的功能了,下面详细说说代理接口:

public interface IHelloWorld{public void sayHello();
}
public class HelloWorld implements IHelloWorld{public void sayHello(){System.out.println("hello world!");}
}

现在是要在方法层面,给代理接口里的方法里添加功能,如何做这么细粒度的动态功能增强呢?(也可以说是织入,这个词,在国内是疯狂软件的李刚老师第一个提出来的,老师就真的很强,向走在前面的探路人,伟大的前辈们致敬!)

如何给代理接口中的这个目标方法,添加想要的功能呢?必须通过实现InvocationHandler接口,那么我们来看看这个接口里面有什么:

只有一个方法invoke!通过这个接口里的方法,写你需要动态增强的功能,比如日志记录等等。invoke中文:调用、引用,也就是说这个接口的功能,就是让你在运行期间动态增强时调用这个方法来代替原来的方法,达到在原方法基础上功能增强的目的。

public class LoggerHandler implements InvocationHandler {private Object target;public LoggerHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 要增强的功能Logger.startLog();// 原来的方法Object result = method.invoke(target, args);// 要增强的功能Logger.endLog();return result;}}

说说LoggerHandler,英文:处理日志记录的人,那么他就负责记录日志,代理类会调用它,并把真正的目标方法传给他(method变量)让他为目标方法添加日志记录的功能!

用Proxy.newProxyInstance(...)生成动态代理的类,这个类的代理方法(目标方法),包含了增强的功能!

IHelloWorld hw = new HelloWorld();
LoggerHandler handler = new LoggerHandler(hw);
IHelloWorld proxy = (IHelloWorld) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),hw.getClass().getInterface(),handler);
proxy.sayHello();

所以运行时其实是动态生成了代理类,并调用了LoggerHandler的invoke方法实现功能增强。

所以用面向对象的方式思考动态代理 ,总结下来就是:

我们要为一个对象的行为添加一个动作,比如啪啪啪前带套套的动作,此时我们需要把啪啪啪这个动作抽象出来,创建一个另我(代理对象),让全新的我实现这个啪啪啪的接口来执行啪啪啪动作,然后创建一个另一半,她拥有带套套的功能,它通过实现InvocationHandler接口,拥有invoke的功能,在这个功能里,可以设计她如何为我带套套,同时又可以拥有和我啪啪啪的行为(我把啪啪啪的method变量传递给她)。之后我在啪啪啪的时候(运行时),通过啪啪啪行为(面向接口编程)创建出来的全新的我,会把会带套套和我啪啪的另一半也融合进来,再调用啪啪啪行为时,就会有另一半为我带套套。实现了啪啪啪时才带套(运行时动态增加行为),而不是妹子还没约到就开始自己带套!

刘欣《码农翻身》之动态代理读后感相关推荐

  1. 阅读源码的三种境界 (转自 码农翻身 微信公众号)

    刘欣 码农翻身 "没有经验的技术差底子薄的初级程序员,如何阅读项目源码? " "有人阅读过 mybatis 的源码吗 ?就看一个初始化过程就看的已经头晕眼花了,小伙伴们支 ...

  2. 码农翻身讲计算机基础:并发,同步与信号量

    本文首发于我的个人公众号:程序员江湖 欢迎大家关注我的微信公众号:程序员江湖 努力成为最有影响力的程序员自媒体,专注于面试,职场,个人提升三大主题. 干货满满,不容错过. 那些烦人的同步和互斥问题 原 ...

  3. 码农翻身讲网络3:从Socket编程到HTTP服务器

    小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?(HTTP请求) 原创: 老刘 码农翻身 1月2日 1前言 这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器 ...

  4. 码农翻身讲网络5:从Web安全到HTTPS

    浏览器:一个家族的奋斗 浏览器家族的安全反击战 黑客三兄弟 黑客三兄弟(续) 一个故事讲完https 深入浅出HTTPS工作原理 原创: 刘欣 码农翻身 2017-12-12 我是你们每天都要使用的浏 ...

  5. 码农翻身讲计算机基础:补码,程序编译与递归

    从1加到100:一道简单的数学题挑战下你的大脑 原创: 刘欣 码农翻身 2017-01-03 2017年的第一篇, 写给刚刚踏入计算机编程领域的小白吧. 所谓编程,就是把自然语言的需求翻译成计算机语言 ...

  6. 码农翻身——Java帝国之动态代理

    已经快三更天了, Java帝国的国王还在看着IO大臣的奏章发呆,他有点想不明白, 帝国已经给臣民了提供了这么多的东西,他们为什么还不满意呢? 集合.IO.反射.网络.线程.泛型.JDBC ...... ...

  7. 一篇看懂顺序表!!(刘欣大佬《码农翻身》特别提及)

    顺序表 1.1定义 顺序表是用一段物理地址(内存)连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数   据的增删查改. 1.2分类 顺序表一般可以分为: 静态顺序表:使 ...

  8. 《码农翻身》读后感---程序员的潜规则

    最近读了一本好书,<码农翻身>,推荐没读过的小伙伴可以读一下.前面通过小故事介绍计算机世界中的方方面面,特别的有意思. 作者在最后一章根据自己成为架构师路上点点滴滴的经验,给广大程序员提供 ...

  9. 编程难在哪里? 一个美国实习生的故事。(转自刘欣老师的微信公众号——码农翻身)

    阿莱克西斯 码农翻身 3天前 作者:阿莱克西斯 来源: https://www.zhihu.com/question/22508677/answer/276595266 记得之前组里来了一个美国实习生 ...

  10. 《码农翻身》总结整理

    最近突然想把自己读过的一些书总结一下,做个记录.<码农翻身>是我毕业之后认真读过的第一本书,从此之后一发不可收拾,上网买了一堆博客大神推荐的书,读完之后也有自己的一些总结,后面会陆续补上. ...

最新文章

  1. loadrunner中创建唯一随机数
  2. 海淀温泉镇迎来大爆发!5G基站、产业转移示范基地、自动驾驶核心测试区.........
  3. WCF入门(三)——对象序列化
  4. 在不是Thread类的子类中,如何获取线程对象的名称呢?
  5. 【Python】编程笔记5
  6. 常熟理工学院计算机网络基础,常熟理工学院计算机网络复习题之简答题
  7. 遥感图像增强方法应用
  8. matlab打开笔记本摄像头_如何解决笔记本电脑摄像头异常问题
  9. OpenShift 4 - DevSecOps Workshop (14) - 镜像合规扫描
  10. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---41
  11. 5. PHP APC APCu 安装使用
  12. LeetCode第13题 罗马数字转整数
  13. GPS从入门到放弃(十三)、接收机自主完好性监测(RAIM)
  14. 微积分是研究连续变化的数学理论
  15. 新浪微博api接口java_新浪微博API(java版)
  16. 学习MyBatis-Plus
  17. “东方树叶”走红背后,起底农夫山泉的“科研军团”
  18. 20175208 《Java程序设计》第十一周学习总结
  19. linux自动同步onedrive,如何在Linux中同步微软OneDrive
  20. 微信内置浏览器 非全屏播放视频解析

热门文章

  1. 2017--年终总结
  2. 最新windows7旗舰版密钥
  3. BZOJ4816 数字表格
  4. bzoj4816 Sdoi2017 数字表格
  5. 怎样看股市K线图指标之成本均线指标CYC
  6. 国家公祭日(国家哀悼日)将网站改成悼念灰黑色的方法
  7. 里氏转换,arraylist,path,file
  8. ASEMI双向可控硅BTA12A,BTA12A特征,BTA12A主要用途
  9. 8.2.1 消息通知过时写法解决
  10. 这些行业高薪职位最多