第6讲 | 动态代理是基于什么原理?
该思维导图由 AI 生成,仅供参考
典型回答
考点分析
- 深入了解
- 翻译
- 解释
- 总结
Java中的动态代理是基于反射机制实现的一种方便运行时动态构建代理、动态处理代理方法调用的机制。通过反射,程序可以在运行时自省,直接操作类或对象,包括获取类定义、属性和方法,调用方法,甚至修改类定义。动态代理是一种广泛应用于产品开发中的技术,可以优雅地解决繁琐的重复编程问题,比如包装RPC调用、面向切面的编程(AOP)。实现动态代理的方式有多种,包括JDK提供的动态代理和基于字节码操作机制的实现方式,如ASM、cglib和Javassist。 文章深入探讨了反射机制和动态代理的原理,考察了读者对这些知识点的了解和掌握程度,以及动态代理在业务系统中的应用场景和不同实现方式的取舍。反射机制的演进和动态代理的发展历程得到了详细阐述,同时对JDK动态代理和cglib动态代理进行了比较,分析了它们各自的优势和适用场景。此外,还探讨了动态代理在AOP等切面编程中的应用,以及动态代理在实践中的选择考量。 总的来说,本文对Java反射和动态代理进行了全面而深入的探讨,适合想深入了解这些知识点的读者阅读。文章内容涉及的知识点庞杂,但对于想深入了解Java反射和动态代理的读者来说,是一篇值得阅读的文章。
《Java 核心技术面试精讲》,新⼈⾸单¥59
全部留言(85)
- 最新
- 精选
- 肖一林提一些建议:应该从两条线讲这个问题,一条从代理模式,一条从反射机制。不要老担心篇幅限制讲不清问题,废话砍掉一些,深层次的内在原理多讲些(比如asm),容易自学的扩展知识可以用链接代替 代理模式(通过代理静默地解决一些业务无关的问题,比如远程、安全、事务、日志、资源关闭……让应用开发者可以只关心他的业务) 静态代理:事先写好代理类,可以手工编写,也可以用工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。 动态代理:运行时自动生成代理对象。缺点是生成代理代理对象和调用代理方法都要额外花费时间。 JDK动态代理:基于Java反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象。新版本也开始结合ASM机制。 cglib动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类。 Java 发射机制的常见应用:动态代理(AOP、RPC)、提供第三方开发者扩展能力(Servlet容器,JDBC连接)、第三方组件创建对象(DI)…… 我水平比较菜,希望多学点东西,希望比免费知识层次更深些,也不光是为了面试,所以提提建议。
作者回复: 谢谢反馈,类似ASM这种字节码操纵是有单独章节覆盖的,前面基础篇有个整体印象,免得陷入细节;Java内部动态生成还有其他领域,比如Lambda实现机制,个人认为一起分析会连贯一些
2018-05-1716671 - 云学看了好多篇文章,总体感觉是比较累,无论读者是否具有java背景,都应该让他看懂,而不是越看越糊涂,疑问反而更多了
作者回复: 非常感谢,读者基础不同,我尽量兼顾并增加基础的介绍,因为也有反馈希望可以更全面、深入... 有好的建议请不吝赐教
2018-06-09663 - Douglas好像和啥原理没啥关系吧,总结来说就是jdk 自身的反射机制或用第三方库,哪哪看到的都这样说,一笔带过
作者回复: 谢谢反馈,字节码操作、运行时拦截、加载期编织 、Java agent等,会和Aop单独介绍,那些内容不是几句话说得完
2018-05-1734 - bigfish本来资质愚笨,看不懂很多东西的原理.想进来学习一下,jdk动态代理的原理和cglib代理原理等一些原理性的东西(其他章节也是如此).发现听到原理性的东西不多都是一带而过.其实您做的课件针对很多点都是一带而过,听到某个名词一下来了兴趣继续一听结束了.我们都知道Java很大很多可以研究的,其实我们想听的很多是一些点的原理,讲完原理在结合实际应用阐述一下.也许我们就会有些豁然明朗的感觉.希望能理解一下!!!
作者回复: 谢谢反馈,后面类加载章节介绍了两者底层机制,照顾下不同基础的读者
2018-07-08220 - 正光整体感觉讲的太浅,水上漂的感觉
作者回复: 具体底层细节在jvm字节码操纵那一讲,难度把握不准请见谅
2018-08-04317 - 约书亚先回答问题: 99%的Java程序员应该都间接使用了AOP。自己项目里直接编写的,比如调用追踪,通用日志, 自动重试 反射和AOP真是双刃剑效果拔群的技术。从MVC开始约定胜过配置的开发理念大行其道,ORM自动映射,plugin模式,到现在的spring + boot +cloud 的declarative编程大量基于此实现,可以说没有反射和AOP就没有Java的今天。反面就是,自己想进行定制化的改造封装真挺苦逼 再提问题: 1. 听到过个说法,反射慢因为一是获取Field,Method等要进行元数据的查找,这里有字符串匹配操作。二是Invoke时,要进行一些安全性上的检查。这种说法对么?JVM在解释执行的时候就不做一些操作内存操作的检查了么?如果不对,那原因是什么?还有没有其他? 2. 以前写C#的,里面可以拼表达式树,运行时生成一个函数(不需要有对象),理论上性能是和手写代码一样的,但可以缓存起来。这解决的是手写中间代码太难的问题。请问Java有这种类似的功能嘛?
作者回复: 1.基本如此;反射是相对保证类型安全的,我觉得要比较也是和methodhandle之类对比,那个更是接近jvm内部的黑盒,性能更好 2.你是说lambda?也是需要jvm生成call site,然后invokedynamic之类调用,所以首次调用开销明显,C#不了解,不过动态生成的感觉都是如此吧; 这东西目前没有cache,如果你说的是存储在文件系统;未来,嘿嘿…… 这些太零碎,说过了会有单独章节介绍,不然没基础的就晕了,还用不上
2018-05-1712 - THROW老师可以在分享结束时推荐一些好的文章,书籍甚至演讲之类的么?
作者回复: 没问题,喜欢底层,去查查JavaOne,FOSDEM,jvmsummit等
2018-05-179 - 灰飞灰猪不会灰飞.烟灭cglib是怎么实现对目标对象的拦截的呢?
作者回复: 计划单独介绍
2018-05-174 - 蒙奇D路飞感觉细节层面缺少具体描述,希望后续对底层原理的描述更细致些~
作者回复: 谢谢反馈,有章节介绍类似字节码操纵之类底层技术,照顾不同基础
2018-05-282 - 陈坤说的很多都是表层的!比如可以针对cglib,深入讲讲原理
作者回复: 谢谢,第24讲补充了一些底层原理性分析
2018-11-231