00:00
来,我们接着往后说,呃,那么现在我们已经能获取到代理对象了,那么你获取到这个代理对象,你能做什么事儿呢?注意它所能做的事全部都在引窝方法里面编写的好,接下来我们就来看这个方法里面呢,有这么几个参数啊,首先第一个pro,你们来看看它是一个什么意思呀,这就是我们生成的那个代理对象,能明白吗?啊,说这个事特别特别绕哈,你看一下特别绕,绕成什么呢?我生成代理对象的时候,我需要传一个invoc handler的对象,而我invoc handler对象里面的这handler里面呢,引work方法里面又会有一个代理对象,其实他是谁啊,他就是他。也就意味着什么呀,你在生成这个代理对象的时候,你需要传一个invoc handle的对象,而将来他的引VO方法想要被调用,对吧?那么你得通过引VOC handle了这个对象去调用我的引方法,并且你要给我传进来你的代理对象是吧?这个比较绕啊,但是这个在我们Java里面的设计上来讲是很常用的,好吧,所以说呢,刚才为什么给你强调一下为什么?呃,就是执行它的时候会不会执行这个方法呀,肯定是不会的嘛,你要说执行它的时候你就执行这个方法,我问你这对象你咋给我传进来,你都没有生成了,你能给我传进来吗?
01:30
那么不行嘛,对吧?啊,所以这个大家理解啊,但是我们要注意这个代理对象吧,在我们这个引用和方法里面啊,就是好在引入和方法中,好方法中啊,方法中一般不会使用,听懂了吧,你传你就传进来吧,我一般是不会再去用它的,而且我们要慎用,因为稍微一不留神就出问题了,听懂了吧,稍微一不留神就出问题啊,所以说在这里面我们主要解释的是后面两个method以及我们的A,这个method是什么意思呢?就是正在被调用的方法对象能明白吧,它是什么呀?正在被调用的一个方法对象能听懂什么意思吧?哎,正在被调用的一个方法对象,好,那么下面这个二呢,那不就是什么呀,正在被。
02:30
可调用到啊,方法的什么呀,参数理解了吧,哎,方法的参数好吧,那接下来我们注意了啊,那你看我代理对象,我要去增强你原本的这个目标,比如说这是我原本的目标对象,它有一个什么加减乘除的功能吧,那我要去增强你啊,无非就是在你这个加减乘除的基础之上,我再给你去扩展出一些什么别的东西来吧。对不对,所以说首先在这里面我们要完成一件非常重要的事儿,就是什么呀,先去什么呀,将什么呀。
03:06
将什么将功能就是将什么呀,将这个方法的调用先转回到我们的目标对象上,你得保证你代理了我以后,我原本的功能得能执行,对吧?那么这个地方怎么做呢?你看我现在既有我的目标对象,又有我正在被调用的方法,那这事就特别简单了,method.in work,我把我的target传进去,把我的UPS传进去,这就相当于通过目标对象调用到了目标方法,就相当于执行了什么呀,哎,可以就相当于什么呀,相当于好执行我们谁呀,执行我们的这个类啊,一定要注意执行这个类中的。好,执行这个类中的谁呀?加减乘除能明白了吗?诶,这就是我们的一个什么目标对象,然后呢,执行我们的目标方法,好,那么既然你调用了是我的这个加减乘除,最终我肯定是有个结果的,那么这个结果它就是一个object类型的一个result,翻译它这就行了,然后最后呢,你把这个result给我返回,回去听懂了吧,OK,那么你看一下,那你绕了这半天,你最终你不就是执行了一个加减乘除吗?你的日志在哪呢呀?
04:31
是不是你代理的功能日志在哪呢呀,来,我告诉你,你在这能执行我的目标方法,那我在这个地方我能不能记录我的日志啊,能不能我在这个地方我能不能记录我的日志啊,那你来看一下,我还需要在我的,我现在还需要在我的这个里面去写这些代码吗?需要吗?我把日志的功能是不是已经给你搬到了这个位置了,对吧?OK,所以大家注意了啊,呃,我们先把它写完啊,记录日志怎么记录啊,那就是Co,我们来输出一下,说出什么呀,比如说这是我们的代理啊,就是我们的日志代理,听懂了吧,它里面帮我们实现的功能,什么功能呢?就是来你的method谁呀,哪个方法呀,其实我也不知道是哪个方法,但是呢,我有方法对象,我能不能获取到方法的名字,可以吧,来说一说呢,注意获取方法的名字怎么获取呢?String类型的method name等于什么呀?等于method.get name获取到方法的名字,那这个位置我就加上method name能看到吧,再加上注意好说这个方法开始begin。
05:56
With是不是要看加什么呀,加上我们的参数吧,那你看这个参数是不是也给你放到这了,OK,它是一个数组形式的啊,数组的话我们不好打印,那我就怎么做呀,risk.as list,把它转成一个list,是不是直接就打印出来了。
06:14
能看到这个吗?用没用过。是不是把一个数组转成一个集合啊,对吧?数组转成集合我是就能直接去打印了,能看懂这个吧,OK,好,那么这个我们就写好了,写好以后来下面记录日志,那我还可以怎么写啊,来sayo好,搞什么呀,还是我们的logging好,Log pro啊,找了个歌啊,然后什么呀,就是你的啊。好,Method来加上我们的method name,好加上什么呀,And with OK,再加上一个什么呀,再加上一个result是不是行了,你看一下我这个日志记录跟你这里面的日志记录一样不一样,差不多吧,就前面不一样啊,因为我要给你去区分嘛,所以说前面我不能让他一样啊好,那么接现在的话,我就可以通过我的这个日志代理呢来去帮你记录这个日志了,你就完全没必要在这里面去写这个日志了,听懂什么意思了吧?OK,好,那么现在呢,我要去做一个事啊,做一个什么事呢?大家注意,呃,我重新去建一个什么呀,建一个这个package吧,我把它分开啊,这是我们A的一个什么呀,Pro就是我的代理在这个里面呢,大家注意哈,我把刚才的这三个类呢都给他拿过来。
07:54
对。诶啊,不能都拿走是吧,还再放回去是吧?啊不能这样,就是就相当于我拷贝过来一份啊,然后在原来的这个before里面呢,像这个代理我就删掉了啊,我不用它了,然后呢,这就是我们留的最原始的,你看到没有,就是存在问题的那一份看到了吧,而注意在我刚刚拷贝出来这个pro这个包下面的,Pro这个包下面我们有一个接口,有一个实现类,但是这个实现类里面我就不需要这些东西了,为什么呀,我通过代理来实现了,那你看一下在我这个包下面,我现在是不是有这个代理呀,对不对,哎,这个东西我是写好的啊,就是相当于我把它重新写了一份,我们不要在原先的基础上去改,把那个呢给大家留着啊,你去做一个对比好吧,那现在我们这个就写好了,写好以后的话,大家注意,接下来我们要去做一个测试了啊,这个测试非常重要,大家都看好了。
08:55
好在这个process下面我们来去做一个测试啊,用一个啊就class吧,啊就写个方法吧,好在这里面我们加上一个。
09:07
那方法能看懂吧,然后这里面我们做什么事啊,首先你是要去创建这个目标对象啊,对不对啊,目标对象,目标对象是谁的target等于什么,有一个a magic是他呀,被大包是我当前房下了,这是我的目标对象吧,然后接下来我是要获取什么,获取我的代理对象了吧,怎么获取代理对象呢?我去用一个magic。是不是这个process啊,对不对,就用这个类,这个类里面我给你传递去我的目标对象,然后呢,我再调用get process是不是获取到一个代理对象了,而代理对象它是一个object类型的啊,Op go,好,但是现在代理对象如果你是一个object类型的,那你没办法去做任何操作,我们需要把它转回我们的什么呀?转回具体的对象,那么你来想一想,我要转成什么类型的,转成什么类型的,我能转成这个类型的吗?能吗?能不能,绝对不可能,我告诉你。
10:18
为什么不可能呀,因为你们就是不同的对象,你怎么可能转成同一个类呢,对吧,你要理解这个代理对象它怎么生成的啊,刚刚我们不是在这个生成代理对象的时候,我是不是给他指定了所有目标对象的接口吧,那现在我们来找他们的关系啊,什么关系呢?我有接口,目标对象呢是实现了这个接口的,代理对象呢,也实现了这个接口,那么他们两个有什么关系啊?他们实现了同样的一个接口啊,是不是实现了相同的接口,而对于他们两个来讲,他们只是一个兄弟关系,兄弟关系你觉得能相互转换吗?不行,所以说呢,我能把它转回成接口类型的可以吧,哎,就是我们的,呃,代理对象pro等于什么呀。
11:08
哎,给他强转一下,后背高强转一下,那么再来看拿到这个代理对象以后呢?诶,我要给我们刚才说的啊,我要给你们造成一种假象,就是我也是有加减乘除功能的,那么你来看我pro能不能调到我的方法呀,绝对能问你都是这个接口类型的了,你还调不到它的加减乘除方法吗?你看ADDDD能掉吗?S能调吗?都可以来,我们就调一个ADDDD方法,好,比如说我就算个一加一。最后呢,给我返回一个结果,这个结果是什么类型的呀,Int类型的好,最后来输出一下啊,我们的这个结果好卖方法里面测试的这个结果啊,好加上我们的。先看结果是吧,来运行一下,呃,首先你要确保现在我这个目标对象里面有没有志记录的功能,没有好说出来,如果你要是能看到有日志记录的功能了,说明什么呀,说明我们的代理是不起作用了,看到了吗?诶,这个我们来把它稍微改一改啊,少了个空格,好,再来看这个效果。
12:17
你看吧,我就在这个慢方法里面,其实我做了什么事啊,我就单纯的去调了一下这个APP方法,但是我代理的功能就已经加进来了。看到了吗?而且我告诉你,现在你不仅ad有这个功能,而且你调用任何一个方法,它都有这个功能,都有这个日志的一个什么功能。能看明白了吗?啊,这就把它实现了。啊,那么现在你们可能都是一头雾水是吧?啊,这啥玩意儿是吧?写了半天对吧?难吗?难不难,说实话难不难,难吧,我告诉你这东西才有价值是吧,刚刚写的那些代码,那就是什么啊,玩具代码对吧?没有任何意义的啊,这个东西才有意义,OK,行吧?呃,那我们先暂时先说到这儿,那么一会儿回来以后,大家先这个放松放松是吧,先放放脑子是吧,一会儿回来以后,我来给你解释动态代理它底层是怎么实现的,对吧?所以说一会儿还是一场头保头脑风暴啊,但是呢,这个过程我们必须得去做,做完以后你才能去理解动态代理底层怎么做的,你才能把我们刚刚写好的这个代码给它穿起来,明白吧?啊,所以说一会我们还要再往上的去挖,听懂了吧?OK,先下课休息一下啊。
我来说两句