理解Java动态代理需要对Java的反射机制有一定了解
什么是代理模式
=======
在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。
例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买票。又如找女朋友、找保姆、找工作等都可以通过找中介完成。
定义
==
由于某些原因需要给某对象提供一个代理以控制对该对象的访问。
访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
代理模式的主要角色
=========
-
抽象角色(Subject):通过接口或抽象类声明真实主题和代理对象实现的业务方法。
-
真实角色(Real Subject):实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
-
代理(Proxy):提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
-
客户:使用代理角色来进行一些操作。
优点
==
代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
代理对象可以扩展目标对象的功能
代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性
缺点
==
冗余,由于代理对象要实现与目标对象一致的接口,会产生过多的代理类。
系统设计种类的数量增加,变得难以维护。
使用动态代理方式,可以有效避免以上的缺点
静态代理
====
静态代理其实就是最基础、最标准的代理模式实现方案。
举例:
Rent . java 即抽象角色
Landlord . java 即真实角色
Proxy . java 即代理
Client . java 即客户
结果:
-
带房客看房
-
房屋出租
-
收中介费
-
Process finished with exit code 0
在这个过程中,客户接触的是中介,看不到房东,但是依旧租到了房东的房子。同时房东省了心,客户省了事。
静态代理享受代理模式的优点,同时也具有代理模式的缺点,那就是一旦实现的功能增加,将会变得异常冗余和复杂,秒变光头。
为了保护头发,就出现了动态代理模式!
动态代理
====
动态代理的出现就是为了解决传统静态代理模式的中的缺点。
具备代理模式的优点的同时,巧妙地解决了静态代理代码冗余,难以维护的缺点。
在Java中常用的有如下几种方式:
-
JDK 原生动态代理
-
cglib 动态代理
-
javasist 动态代理
JDK原生动态代理
=========
上例中静态代理类中,中介作为房东的代理,实现了相同的租房接口。
例子
首先实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法。
然后在需要使用Rent的时候,通过JDK动态代理获取Rent的代理对象。
客户使用动态代理调用
运行结果和前例相同
上述代码的核心关键是Proxy.newProxyInstance方法,该方法会根据指定的参数动态创建代理对象。
它三个参数的意义如下:
-
loader,指定代理对象的类加载器
-
interfaces,代理对象需要实现的接口,可以同时指定多个接口
-
handler,方法调用的实际处理者,代理对象的方法调用都会转发到这里
Proxy.newProxyInstance会返回一个实现了指定接口的代理对象,对该对象的所有方法调用都会转发给InvocationHandler.invoke()方法。
因此,在invoke()方法里我们可以加入任何逻辑,比如修改方法参数,加入日志功能、安全检查功能等等等等……
小结
==
显而易见,对于静态代理而言,我们需要手动编写代码让代理实现抽象角色的接口。
而在动态代理中,我们可以让程序在运行的时候自动在内存中创建一个实现抽象角色接口的代理,而不需要去单独定义这个类,代理对象是在程序运行时产生的,而不是编译期。
对于从Object中继承的方法,JDK Proxy会把hashCode()、equals()、toString()这三个非接口方法转发给InvocationHandler,其余的Object方法则不会转发。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/8f1288d0a77af9b59dc9179cab98afb7.jpeg)
最后的内容
在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)
如何准备面试?
1、前期铺垫(技术沉积)
程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。
下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问
这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!
- Java程序员必看《Java开发核心笔记(华山版)》
- Redis学习笔记
- Java并发编程学习笔记
四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇
- Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)
- 大厂面试必问——数据结构与算法汇集笔记
其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。
2、狂刷面试题
技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。
①大厂高频45道笔试题(智商题)
②BAT大厂面试总结(部分内容截图)
③面试总结
3、结合实际,修改简历
程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:
以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
你挑选:
[外链图片转存中…(img-aln9jD3k-1713512136698)]
以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!