java笔记之动态代理一只小菜菜鸟

窗外阴绵绵的,一场疾走的雨在上午短暂地到来又消失。天气有些闷,一个人在卧室无聊时敲几段代码,到是能有一丝心安。

因为疫情影响,至今还未开学,在家自学spring框架,期间遇到了很多问题。

讲动态代理之前,先了解为什么需要动态代理。动态代理能解决相当多的问题,但是按照其代理的进化关系,应该说是为了弥补静态代理的不足,在静态代理的思想上增强其实力。

增强什么实力?就要了解静态代理有什么不足。但是我们得先知道静态代理已经具备怎样的实力。

我最直观的理解,静态代理的目的就是为了对一个对象的行为能力进行增强。先举一个静态代理的例子。

例子:一个行人要出行,他需要先实现拥有出行这个行为的接口,下面是接口代码。

package静态代理;publicinterfaceTrip{//pedestrian:行人,trip:出行voidgout();}既然是行人出行,就要有人实现出行这个行为,下面是接口的行人实现。

package静态代理;publicclassPedestrianimplementsTrip{//pedestrian:行人@Overridepublicvoidgout(){//TODOAuto-generatedmethodstubSystem.out.println("行人出行……");}}行人出行有许多方式,可以乘船,坐火车汽车或者飞机等,为了方便,这里让行人乘坐汽车出行,这样就需要让行人坐进汽车内让汽车跑到终点,相当于对行人出行行为的增强,如下代码。

package静态代理;publicclassCarimplementsTrip{privateTriptrip;publicCar(Triptrip){this.trip=trip;}@Overridepublicvoidgout(){//TODOAuto-generatedmethodstubbeforeGout();//出行前增强处理trip.gout();afterGout();//出行后增强处理}publicvoidbeforeGout(){System.out.println("出行方式:乘坐汽车出行");}publicvoidafterGout(){System.out.println("即将到达目的地,请乘客注意准备下车!");}}最后来看客户端代码:

packagetest;import静态代理.Car;import静态代理.Pedestrian;import静态代理.Trip;publicclassTest{publicstaticvoidmain(String[]args){//第一步,一个人要出行,实例化出一个有出行行为的行人。Trippedestrian=newPedestrian();//第二步,对行人的出行方式进行增强,让行人乘坐汽车出行。Tripcar=newCar(pedestrian);//第三步,行人完成出行行为。car.gout();}}运行结果为:

出行方式:乘坐汽车出行行人出行……即将到达目的地,请乘客注意准备下车!

相同的例子,当没有小汽车为其增强出行方式的时候,其运行结果为:

行人出行……

通过对比,我们可以发现,不仅行人出行的动作由汽车完成了,而且汽车还为这个动作做出了详细的情况描述。

这就是静态代理。通过代理方式,让行人自己不想做的事情由来汽车代理来完成,并且提供了增强服务。

静态代理总结

优点:

公共的业务由代理来完成,实现了业务的分工;

公共业务的扩展变得更加集中和方便。

缺点:

类爆炸,也就是当有很多除了行人以外的类需要代理时,就需要重新写很多个代理来满足。这样一个项目就会有大量的类。(感觉大部分教程都并没讲清楚为什么会类爆炸,其实如果只有行人类,出行接口,汽车类,那么再来一个快递类,只要实现了出行接口,同样可以让快递装入汽车并通过实例化的汽车类执行以上操作,而并未需要编写额外的汽车代理类。那么到底为什么会产生类爆炸呢,因为对动态代理理解不够,此处先埋下伏笔。)

特点:

编译时代理对象便产生了。

为了解决静态代理的问题,动态代理应运而生。

动态代理主要有两种实现方式。

第一种,基于JDK,需要实现代理的代理委托类必须存在接口。

第二种,基于cglib,需要实现代理的代理委托类必须被继承。

这里先来第一种动态代理的解决方案:

预备知识:

T.class.getMethod(StringmethodName,ClassmethodType.class...).invoke(Objectobject,Object[]args)

t.getClass().getMethod(StringmethodName,ClassmethodType.class...).invoke(Objectobject,Object[]args)

t.methodName(...);

其中:Tt=newT();

上面两种种执行invoke()方法的结果相同,其中object就是T类的实例化对象,其中的args就是参数的对象数组。

动态代理主要依据Proxy类和InvocationHandler接口实现(都来自reflect反射包里)。

下面开始用动态代理的方式来实现上面的例子:

一个行人要出行,他需要先实现拥有出行这个行为的接口,下面是接口代码:

package动态代理;publicinterfaceTrip{voidgout();}既然是行人出行,就要有人实现出行这个行为,下面是接口的行人实现。

package动态代理;publicclassPedestrianimplementsTrip{@Overridepublicvoidgout(){//TODOAuto-generatedmethodstubSystem.out.println("行人出行……");}}与静态代理的不同从这里开始了:

行人出行有许多方式,可以乘船,坐火车汽车或者飞机等,为了方便,这里让行人乘坐汽车出行,这样就需要让行人坐进汽车内让汽车跑到终点,相当于对行人出行行为的增强。

但是,不同于静态代理处理问题的方式,为了统一处理任意的类(包括但不限于行人类),对任意的类的行为的增强,就需要让原本代替行人进行跑到的车(对委托方的类进行增强处理的类)继承一个统一的接口InvocationHandler。(在静态代理中这里的Car类原本继承的接口应该是行人实现的接口,也就是Trip)。

如下代码:

package动态代理;importjava.lang.reflect.Proxy;publicclassTest{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstub//第一步,首先主角出场,也就是实例化代理委托方Pedestrianpedestrian=newPedestrian();//第二步,主角的奔驰出场,也就是实例化代理方。Carcar=newCar(pedestrian);//第三步,主角拿到了奔驰的车钥匙,也就是代理委托方与代理方捆绑到了一起。Tripp=(Trip)Proxy.newProxyInstance(pedestrian.getClass().getClassLoader(),pedestrian.getClass().getInterfaces(),car);//骑上我心爱的小摩托,它永远也不堵车p.gout();}}运行结果:

至此,动态代理部分算是讲完了。(小朋友你是否有很多问号?)

额,龙岭迷窟更新了,去追更了。基于cglib的动态代理有缘再学,ヾ( ̄▽ ̄)Bye~Bye~。

补充:

动态代理是对静态代理的扩展与增强,动态代理拥有静态代理上述的全部优点,与静态代理不同的是,动态代理是在运行过程中产生代理类,而静态代理是在编译时已经产生。从方法上看,动态代理应该是一个可以动态地写代码的工具。意思就是当你需要些一个静态代理时,动态代理会为你写好原本应该由你写的且过程重复的代码,然后再去执行这段代码动态生成代理对象。动态代理其实本质是一个工具,就是动态生成静态代理的工具。

THE END
1.汽车加盟代理商汽车加盟代理商为您找到:汽车代理商怎么加盟?汽车代理商加盟方式有,途虎代理商加盟 | 共创汽车后市场新篇章,途虎等你来加盟!,加盟汽车代理经销商有哪几种类型?汽车代理经销商的类型有以下几种,正新鸡排费用:10-30万,零度先生 MR.ZERO DEGREE全国门店数量:<10家,https://jiameng.baidu.com/searchContentList?query=%E6%B1%BD%E8%BD%A6%E5%8A%A0%E7%9B%9F%E4%BB%A3%E7%90%86%E5%95%86&from=search
2.汽车加盟代理汽车加盟代理10大品牌汽车加盟店品牌有哪些就要加盟网汽车频道提供海量汽车品牌加盟、包含汽车快修、汽车美容、汽车用品等品牌加盟信息,汽车加盟代理哪家好,上就要加盟网。http://qiche.91jm.com/
3.汽车保险代理公司汽车保险代理公司 沈阳中联汽车保险代理有限公司是经中国保险监督管理委员会批准设立的一家全国性专业保险代理公司。公司秉承服务为本、创建方便快捷的承保理念,与中保、平安、太平洋、中华联合、都邦、大地、阳光、人寿等保险公司强力合作,为客户打造优质的服务。 沈阳中联汽车保险代理有限公司 服务热线:13841382702 地址:http://www.zlqc.com/intro/8.html
4.新能源汽车出口代理专业出口汽车代理专注出口13载供应商网(https://m.gys.cn)郑州环航国际货运代理有限公司为新能源汽车出口代理 专业出口汽车代理 专注出口13载批发厂家,价格优惠, 公司秉承“质量优先、信誉至上”的经营理念,更多采购尽在供应商网,17年黄金品牌值得信赖!http://site.china.cn/guojiluyun/5187909758.html
5.汽车品牌代理加盟懂车帝提供汽车品牌代理加盟的详细内容,懂车帝是一个汽车资讯平台,懂车更懂你。我们提供最新汽车报价,汽车图片,汽车价格大全,行情、评测、导购等内容,看车选车买车就上懂车帝。https://www.dongchedi.com/tag/pgc/11765084
6.汽车配件代理加盟汽车配件代理加盟店排行榜汽车配件代理加盟随着生活品质的提高,汽车成为了越来越多家庭的代步工具,使用量的增多,自然会衍生相关行业,汽车配件就是其中一个行业,对于想创业的人来说,做汽车配件代理也是不错的选择。那么想要做好汽车配件代理,就需要想做好市场调查,看行业是否已经达到了饱和状态,另外,还需要具备一些关于汽车配件相关的知识,可以帮助做好代理运营http://www.hanbaojm.com/liebiao/qiche-7383/
7.汽车音响隔音改装汽车音响代理汽车音响品牌DSP功放爱威音响广州橡树贸易有限公司成立于2009年,是一家专业汽车音响品牌销售代理公司。广州橡树目前代理的品牌有:爱威awave、RA、意大利STEG、意大利Audiosystem、美国db等亚洲总代理,美国来福Rockfordfosgate、美国西海岸westcoastcustoms等中国总代理,更值得一提的是,我们拥有这http://www.gzoaktree.cn/
8.汽车保险代理公司怎么开(注册汽车保险代理公司条件及流程)创业开公司是实现人生目标的一个重要环节,倘若想知道汽车保险代理公司怎么开的相关内容,建议你认真阅读本文,一次性清楚汽车保险代理注册公司全流程,也避免少走不必要的弯路。 第一、注册汽车保险代理公司需要什么条件 准备相关资料: ①.房产证复印件,场地使用证明和租赁合同;要求之一 https://www.yinghuodd.com/knowledge/detail_189798.html
9.基于数值模拟和机器学习的汽车碰撞代理模型汽车对墙碰撞的预测与数值模拟力-位移响应曲线中,两个最大峰值的相对误差分别为7.49%和9.6%;两车相向碰撞的力-位移响应曲线中,最大峰值的相对误差仅为2.74%。可见,建立的两个汽车代理模型能准确预测力-位移响应曲线,具有很高的效率和足够的精度。 值得一提的是,在建立该代理模型时,模拟的训练样本的参数选择基于http://qks.cqu.edu.cn/html/cqdxzrcn/2021/2/20210209.htm
10.电动汽车行业发展趋势分析→买购网电动汽车作为人们常用的交通工具,近年来随着我国政府不断出台相关标准规范电动汽车行业的发展,以及电动汽车市场销量的不断提升,电动汽车行业目前所展现出来的发展前景十分可观,因此越来越多投资者想要加入电动汽车行业,那么电动汽车行业发展趋势如何呢?Maigoo小编在文中整理了电动汽车行业的发展趋势,告诉您加盟代理电动汽车行业https://m.maigoo.com/zhaoshang/7774.html
11.云车品汽车用品批发市场网汽车坐垫汽车脚垫方向盘套云车品(原新青年代发)汽车用品批发市场网,整合了浙江台州天台坦头汽车坐垫套、汽车脚垫、方向盘套、专车专用、后备箱垫、车饰等一手工厂货源,专注线下批发、电商一件代发多年,找汽车用品货源批发一件代发请上云车品汽车用品批发网。http://weixin.yunchepin.cn/
12.PTA647购买汽车代理模式购买汽车代理模式ptaPTA-6-47 购买汽车-代理模式 题目: 所谓代理模式,是指客户端(Client)并不直接调用实际的对象,而是通过调用代理(Proxy),来间接的调用实际的对象。 已知有如下Buy_car接口,请编写其客户端子类People类为委托类,以及代理类ProxySale类,具体要求如下。 已有的接口定义如下:https://blog.csdn.net/linsc_05/article/details/134633369
13.为什么“驾驶者需要买车才能就业”是一个幌子?卖车汽车物流货源现如今有哪些新玩家加入了「带货卖车」?除了传统的代理商和租车集团以外,现在的新玩家还包括市区配送物流企业、市区配送货运平台和一批想赚钱的外行,第一点市区配送物流企业有稳定货源的市区配送物流企业,有自己的货源优势,以前都是和当地汽车代理商协作,吸引驾驶者购买货源稳定的车,而不是在市场上寻找散货运力。https://www.163.com/dy/article/G6MHQ67T0547B0X1.html
14.汽车机油代理加盟汽车机油代理要多少钱?怎么代理?汽车服务行业的发展前景一直被众多的投资者所看好,没错,市场需求大、加盟利润高,这些都可谓是汽车服务行业的代名词,开一家汽车服务加盟店也可谓是创业的明智之举。那么加盟汽车服务行业的知名品牌汽车机油代理怎么样呢?汽车机油代理品牌自成立以来一直致力于为广大的车主们提供优质的服务以及满足其需求的产品,包括机油,https://www.jiamengfei.com/xm/128472
15.英飞凌最大汽车电子代理商赴港上市,坚守技术分销十多年最新消息,汽车电子解决方案提供商英恒科技预计将于7月12日在香港上市。英恒也是英飞凌在大中华区汽车板块最大的分销商。 国际电子商情报道,最新消息,汽车电子解决方案提供商英恒科技预计将于7月12日在香港上市。英恒也是英飞凌在大中华区汽车板块最大的分销商。 https://www.esmchina.com/news/201807061620.html
16.「汽车服务代办」汽车服务代办公司黄页清镇市奇云智汽车服务有限公司 主营产品: 汽车手续代办、汽车装饰服务、汽车装饰品代购、道路普通货物运输、物流信息咨询服务、货运代理。 地址: 贵州省贵阳市清镇市云岭中路150-6号 注册资本:50(万元)成立时间:2016-05-06 长垣县宇恒汽车服务有限公司 https://b2b.11467.com/search/-6c7d8f66670d52a14ee3529e.htm
17.新车上牌本人不去,可以找人代理办理上牌吗?热点问题汇编新车上牌本人不去,可以找人代理办理上牌吗? 新车上牌本人可以不去,可以委托他人代理。 汽车代理办理上户所需材料: 1.机动车整车出厂合格证 2.购车发票 3.机动车交强险凭证 4.车辆购置税凭证 5.车主和代理人的身份证原件https://www.xjws.gov.cn/zmhd/rdwthb/content_98792