刘欣《码农翻身》之动态代理读后感
很生动地通过故事讲明白了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变量传递给她)。之后我在啪啪啪的时候(运行时),通过啪啪啪行为(面向接口编程)创建出来的全新的我,会把会带套套和我啪啪的另一半也融合进来,再调用啪啪啪行为时,就会有另一半为我带套套。实现了啪啪啪时才带套(运行时动态增加行为),而不是妹子还没约到就开始自己带套!
刘欣《码农翻身》之动态代理读后感相关推荐
- 阅读源码的三种境界 (转自 码农翻身 微信公众号)
刘欣 码农翻身 "没有经验的技术差底子薄的初级程序员,如何阅读项目源码? " "有人阅读过 mybatis 的源码吗 ?就看一个初始化过程就看的已经头晕眼花了,小伙伴们支 ...
- 码农翻身讲计算机基础:并发,同步与信号量
本文首发于我的个人公众号:程序员江湖 欢迎大家关注我的微信公众号:程序员江湖 努力成为最有影响力的程序员自媒体,专注于面试,职场,个人提升三大主题. 干货满满,不容错过. 那些烦人的同步和互斥问题 原 ...
- 码农翻身讲网络3:从Socket编程到HTTP服务器
小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?(HTTP请求) 原创: 老刘 码农翻身 1月2日 1前言 这篇文章是应网友之邀所写,主要描述一下我们访问网站时, 从输入网址到最后浏览器 ...
- 码农翻身讲网络5:从Web安全到HTTPS
浏览器:一个家族的奋斗 浏览器家族的安全反击战 黑客三兄弟 黑客三兄弟(续) 一个故事讲完https 深入浅出HTTPS工作原理 原创: 刘欣 码农翻身 2017-12-12 我是你们每天都要使用的浏 ...
- 码农翻身讲计算机基础:补码,程序编译与递归
从1加到100:一道简单的数学题挑战下你的大脑 原创: 刘欣 码农翻身 2017-01-03 2017年的第一篇, 写给刚刚踏入计算机编程领域的小白吧. 所谓编程,就是把自然语言的需求翻译成计算机语言 ...
- 码农翻身——Java帝国之动态代理
已经快三更天了, Java帝国的国王还在看着IO大臣的奏章发呆,他有点想不明白, 帝国已经给臣民了提供了这么多的东西,他们为什么还不满意呢? 集合.IO.反射.网络.线程.泛型.JDBC ...... ...
- 一篇看懂顺序表!!(刘欣大佬《码农翻身》特别提及)
顺序表 1.1定义 顺序表是用一段物理地址(内存)连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数 据的增删查改. 1.2分类 顺序表一般可以分为: 静态顺序表:使 ...
- 《码农翻身》读后感---程序员的潜规则
最近读了一本好书,<码农翻身>,推荐没读过的小伙伴可以读一下.前面通过小故事介绍计算机世界中的方方面面,特别的有意思. 作者在最后一章根据自己成为架构师路上点点滴滴的经验,给广大程序员提供 ...
- 编程难在哪里? 一个美国实习生的故事。(转自刘欣老师的微信公众号——码农翻身)
阿莱克西斯 码农翻身 3天前 作者:阿莱克西斯 来源: https://www.zhihu.com/question/22508677/answer/276595266 记得之前组里来了一个美国实习生 ...
- 《码农翻身》总结整理
最近突然想把自己读过的一些书总结一下,做个记录.<码农翻身>是我毕业之后认真读过的第一本书,从此之后一发不可收拾,上网买了一堆博客大神推荐的书,读完之后也有自己的一些总结,后面会陆续补上. ...
最新文章
- loadrunner中创建唯一随机数
- 海淀温泉镇迎来大爆发!5G基站、产业转移示范基地、自动驾驶核心测试区.........
- WCF入门(三)——对象序列化
- 在不是Thread类的子类中,如何获取线程对象的名称呢?
- 【Python】编程笔记5
- 常熟理工学院计算机网络基础,常熟理工学院计算机网络复习题之简答题
- 遥感图像增强方法应用
- matlab打开笔记本摄像头_如何解决笔记本电脑摄像头异常问题
- OpenShift 4 - DevSecOps Workshop (14) - 镜像合规扫描
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---41
- 5. PHP APC APCu 安装使用
- LeetCode第13题 罗马数字转整数
- GPS从入门到放弃(十三)、接收机自主完好性监测(RAIM)
- 微积分是研究连续变化的数学理论
- 新浪微博api接口java_新浪微博API(java版)
- 学习MyBatis-Plus
- “东方树叶”走红背后,起底农夫山泉的“科研军团”
- 20175208 《Java程序设计》第十一周学习总结
- linux自动同步onedrive,如何在Linux中同步微软OneDrive
- 微信内置浏览器 非全屏播放视频解析