00:00
好,下面我们就用代码的方式来实现我的JDK动态代理,原理我们也知道,哎,特点也知道了,用到的这些类也都知道了,下面我们就看如何JDK的动态代理能够帮助我们解决,你随便增加一个功能我都能代理,随便增加个数,One two three four,随便什么都能来,我都能代理,带不带参数,有没有返回值我都能代理。任意的都能代理啊,我们来看干这个活,然后那我需要重新再上一个新的这个项目啊,然后这个有同学这个忘了的来,我一遍遍写就会记,需要新建new model,然后ma,然后选择股架,然后ma的quick star,这个是建Java SE的项目,不是JA web web建的是它,这是va SE的项目,然后在下一步,然后呢,Co打点BJ po power node,然后iac ID呢是我们当前的。
01:01
丹尼。杠002-JDKJDK动态代理一看就知道了。然后下一步就闭着眼finish完了,然后从这改一下JDK的这个版本,OK啊,这就创建好了啊,创建好了以后来改改目录啊,改目录,目录呢,两个大目录是在的,然后缺一个子目录,不管我用不用得到re SOS,你不加这个目录,这次当次运行是不会出错,但不规范啊,所以这个一来把这目录补齐了,然后呢,把目录的属性改改。啊,两目录水镜这个因为少,我就直接这么改了,如果多了我们就放到那个结构里去改了,好这个整完了以后,把这不要的这藏那个鬼把它干掉。把它干掉,然后这个也不要啊,这个也不要干掉就行。我是不喜欢项目里面多余的代码不用的,我就把它都干掉,好,目录改完来改造我的,嗯,泡沫文件1.81.8,这个不变,Build干掉。
02:12
搞定,那么到此为止,我的这个项目就打好了,下面呢,我们还是老一套,那么动态代理,静态代理干的就是代理功能,所以还得来照参照这个图我们来写代码啊,那么这个图呢,肯定是我们说了动态代理是不是这一趟是一样的。这一趟是一样,就这一趟有一丢丢不一样,这趟一样的,那我们有接口,先上接口呗,你看我都不会从前面站,我都带你们重新写上接口啊,然后呢,在这servev把这个。换成接口,然后打点就erv service这个接口里面呢,就规定业务功能我就不说了啊,我们还是刚刚那个VD thing,我们先用这一套把它走通了,我们再改变它,再优化它啊好了这时候业务接口。
03:07
业务接口完了,你是不是得有时间嘞,Superstar流先来啊,然后呢,呃,是我们的I'mtl打点up superar superstar Liu啊,然后来。这是我的目标对象,刘德华。德好,那么怎么着?Service啊,Service好实现里面未被实现的方法,然后这跟刚刚一模一样,同学们,我只是为了让你加深印象啊,一遍遍去写。好,那么这个目标对象也整完了,反正我肯定还要上个周润发嘛,来吧,都来吧,啊,然后呢,我们这个superstar。
04:14
那么implement实现service的这个接口啊,然后实现接口中未被实现的方法,然后呢,我是。好,那么这个呢,也是目标对象,这个你一定要有这个概念,一定要有,哎,目标对象周润发。好了,我的一个接口和俩实现都搞好了,这个就是我将来我要代理的就是华仔和发哥他们的增他们的增强的功能嘛,就预定场地,预定时间和结算费用,不然你直接调他是不是只有这一句话,我应该让他有预定时间,预定场地和结算费用,这才是一整套流程,那一套流程放哪呢?同学们放到。
05:11
动态代理里面啊,我其实应该正经的就是动态代理这个功能,但是呢,我先得要搞一个代理工厂的这么一个类,我之后给你们解释为什么要这么干,你先跟着我转啊,然后呢,在当前的这个pro BJ po note的这个目录下新建一个工厂类啊,Pro pro proxy这个包中的。A factory proxy FA。Facebook factory啊,这个呢,其实是做一个工厂类啊,做一个工厂类,在这个工厂中呢,我们要干的活是一样的。类中的成员变量啊,设计为接口,这个目的是干嘛呢?就是我们当前的那个service。
06:06
就是我们当前的这target target盖就是要这个目标对象的啊,一样的这个工厂还得传入目标对象啊,传入目标对象类中的成员变量设计为接口目标对象吴德勇啊,传入目标对象还是public,然后我们的proxy prox proxy factory还是这个,那么参数呢,这个跟前面静代理一模一样,一模一样啊。Target,然后在这呢,就this打点target等于。等于他干完了这个工厂干的活,跟我们以前静态代理一模一样,无论你是什么代理,就记住我这句话。动态代理也好,静态代理也好,你总得把目标对象给我,我去代理你的功能,对不对?你总得给我,你总得把目标对象给到我手里,我才能去给你完成代理的功能,是不是这么个道理?
07:11
能懂吗?所以在我的工厂类中,我也需要目标对象,也需要传入目标对象,下边我是不是就写一个方法,这个方法是返回动态代理对象,返回我总共我就是要这个动态代理对象嘛,这个工厂里会生产多个动态代理对象。我就返回动态代理对象,那么动态代理对象你们猜他的返回值应该是什么?我代理对象是不是可以是任意类型啊,我任意类型都可以,所以它是object,那么就get age,这这你们就理解吧,这个就相当于说我就是为了得到agent,拿到这个代理对象,不过是个动态的。我就干这个事,能明能明白吗?同学们啊,好,那么在这怎么拿到动态代理对象呢?
08:07
我们刚刚这个方法可不是吃素的,这个方法就是用来干这个活的,这个方法就是干这个活。啊,那就调用嘛,人家都有现成写好的方法吗?Re proxy prox y俩俩哪个?是不,Long打点reflect,这就是我刚刚给你们指出在哪个包的原因,这个地方要用的pro打点new pro instance调用这个方法,这个方法跟一个,如果这个参数我整完了以后,这个agent方法就是得到D的动态代理。能明白吗?就这么个事,好了,那来对付这个恶心的这个参数,哎,跟进去源嘛,你会发现。当前的这个new,这里面有三个参数,CTRLC拷过来,因为在这个地方我要详细的解释这三个参数,那你在干活,你就得解释它,诶哪去了。
09:13
好。这个里面呢,有这么三个参数,哎,三个参数,然后呢,先把这个参数B。B掉啊,那么这个参数是干嘛使的呢?这个参数我们刚刚有说过,它就是。类加载器啊,完成目标啊,目标对象的加载。因为我传进来是那个目标对象,这个必须要加载到JVM的内存里,它才能被解析啊,不然整不了,因为它是动态产生的,我程序运行的时候,我动态的得到你的类型加载进。虚拟机啊,那么这个怎么得到呢?非常简单,来他get这目标对象嘛,打点get class,打点get class,不理解你就给我记,就有这么个用法。
10:06
就这么就拿到了啊,然后呢,下一个参数,我们刚刚有解释过它是什么呀。是我目标对象实现的所有接口,所有接口里面它是不是要拦截接口中的方法,这个地方有个点要注意,我的JDK动态代理能够代理的只是接口中的方法,你自己实现类中本身的方法,我代理不了,对不起,因为我们动态代理这个地方已经限定了必须是他接口中的。方法啊,这个拦截的所有的接口怎么拦这么难?Target get这个目标对象打点get class打点get interface搞定。就是这么个事儿,就固定的这种调用,你就别问为什么了,如果不懂的话,你就这么调,把你要人家要的东西配齐给人家就完了,这就是那个工具类,人家就要这些东西,你就给他就完了,别挣扎没有用,听懂了吗?啊,然后再来看。
11:12
那么这还有一个参数,这个参数我们说过,它相当于是什么感觉?这个参数。就是那个实现代理功能啊,代理功能的。接口啊,我们传入的是匿名内部实现,我们传的是个实现。能明白吗?哎,那么就来吧,那你匿名内部实验怎么实现呢?New,哎,你我handle了,回车搞定。啊,回收搞定,然后这个里面呢,你看又调用了一个in work的这个方法,重写in work这个方法,然后呢,这边一堆的每个参数看起来也都不是善茬,哎,没关系,我们解解释一下,这个呢,Proxy是。
12:02
创建的啊,创建代理对象传入就是这个我handle里面你重写的这个方法,人家给你参数的都给了你参数,这个第一个参数呢,就是创建好的代理对象,本来你就是在干代理对象的活,我把创建好的代理对象给你,然后呢,这个参数呢就是。接哦,其实这个method的呢,就是目标方法,哎,Met OD就设目标方法可能是S啊。对吧,可能是我一会要传的那个瘦啊等等,这就是那个目标方法,这个me的,我把目标方法给你,你在里面一调用不就完了吗。能明白吗?目标方法在这里传给你,哎,这就是那个目标方法,然后呢,在这。目标方法的啊,目标方法的参数固定的,固定的就等于说人家在那掐指一算,你要这些内容我都给你。
13:08
你就拿我提供的建仓组去干活就完了啊好,那么在这个里面我来写代码。啊,这个代码呢,就是。就是代理。代理功能,然后呢,又又一个代理功能。代理功能,然后呢,再来主业务功能实现,再来代理功能,我里面干的就是这个活啥啥呢,这是来。代理功能对不对和然后再来,这又是一个代理功能对不对,然后呢,这是我的目标功能对不对,然后这又是我的代理功能,就这么点事。明白吗?所以这个handle这个里面就是这个功能,就是这没别的,哎去写吧,这个我们都会写了呀,啊代理功能来吧。
14:08
这叫什么?预定时间,哎,或者预定场地都行,预定时间点点点。然后再找。预定场地。走走走,业务功能实现放大,那么还有一个预定结算费用,先把代理功能整完。结算费用,哎,这这是不是都整完了。中间的这个我要怎么搞,我这是不是有个他ta target,就是那个传进来的接口打点C,我这么可不可以。不可以。不可以,同学们,你这么着写还是写死了,你永远只能叫C方法。换一个数方法怎么办?调不了吧,还是信方法,这个跟静态代理没区别了。
15:04
你这么着就写死了,这么着肯定不行啊,这么着还是写死了啊,还是写。死了方法的啊,还是写死了方法的调用不成。能明白吗?那这个地方我想灵活的进行方法的调用,因为此时来的方法可能是适应方法,可能是事后方法,可能是什么,One two three four,可能是任意的,你们想你想不到的这些方法,任意的方法我都可以去调,要怎么搞,这么搞,同学们。Method,打点in work。就它,然后呢,参数的目标对象target,然后参数ask搞定什么方法来了,这个都在调用当前的方法。就这灵活了。
16:01
懂我的意思吗?哎,你在外面调用C,这个动作就是在调用C方法,在外面调用show,这个动作就在调用show,你调你外面调的one,这个地方就是one,就这么着,这个方法调用in work,这个方法调用是有返回值的,Object OB BG等于返回值,这个呢就是目标方法的返回值。这个地方切记切记啊,这个是目标方法的返回值,因为这个是在vocation handle里面重写的in这个方法,这个返回值就是目标方法的返回值,而你当前的的这个方法的返回值才是动态代理对象,两套东西给我搞清楚。听懂了吗?啊,这个方法啊,这个方法,也就是说它这个方法调用结束以后的返回值是object,是动态代理对象,可是我重写的override的in work这个方法,这个地方的返回值就是目标方法的返回值。
17:09
哎,就他没错了,好,那么到此为止,我的JDK的动态代理。功能搞定。
我来说两句