00:00
好,那接下来我们就来让大家呢,真正的去看一下人家生成的那个动态代理类。啊,但是呢,在看之前是吧?啊,我现在跟你去说一下,这个动态代理类是我们提前写好的吗?不是,它是在运行的时候帮你动态生成的,你像这个类你你提前把它写好了吗?写好了吗?没有吧,所以说呢,我告诉你动态代理类是在运行的时候动态的去生成的,那这个就是一个问题,啥问题啊,你动态生成的东西在内存里面,他不会给你写到硬盘上,对吧?不像我们自己写的代码,我给你写到这,他不会的,他直接就把它生成到内存里面了。能理解吗?哎,直接就给你设成到这个内存里面了,所以说呢,如果你想看到那个动态代理类,那么我们就需要去做这样的事,做什么事呢?我得把内存里面的东西给他抓出来。能理解吧,好,这个是太困难了哈,但是呢,我告诉你,我们不需要去啊,这么复杂的去做这个事啊,我们只需要去加上两行代码,加什么代码呢?大家注意啊,在这个位置我记得是有的啊,往下翻啊,我们在测试方法里面呢,加上这样两行代码,它就能保存一下,动态生成的这个代理类,它就会给你保存下来了。
01:24
能明白吧,OK,什么代码呢?你看一下啊,就是首先你要获取到我们系统的一个proper,就是系统的一些什么设置,然后呢,在这个系统设置里面呢,你要去啊,加上一个东西叫做什么呀,放点什么,呃,Process,加点save,加file to就是什么呀,让它去保存我动态生成了这个什么代理类,对吧?我们只需要把这两行代码给它加上来,注意加到什么地方呢?加到我们的漫方法测试里面,能看到吧,就加到这上面就可以了啊就这两个代码,它的作用是什么呢?将动态生成的代理类保存下来,理解了吧,OK,这就能给你保存下来了,如果说你不加这个东西,你完全看不到它的,听明白什么意思了吧,能理解了吧,OK,这个东西你不用去记啊,我这个你让我写,我也写不出来,谁能记住这么多呀,你就把它存好了,你用的时候copy过来就行了,对吧,把它当成一个工具来使用。
02:24
啊,OK,来了,那我们再来运行一次,大家注意了,运行一次走一下,好运行完了,那么运行完以后呢,其实它就已经把那个保存下来了,那保存到什么地方了呢?注意你在这里面你是看不到的,你在找谁呢?你在找我们的navigator这个用过没有说过吧,Navigator你这个这个视图里面你就可以看到什么东西了,我把这个都收起来啊,这个视图里面你就可以看到什么东西了,你就可以看到它编译完以后的那个东西了嘛,对吧,那在这个PO02里面,好零二里面,然后呢,我们来刷新一下。看到了吧?诶刷新一下,那么现在呢,这就是我们对应的我们刚才的那个对应的这个地方的SPRING02是不是就这个工程啊,在这个工程下面,它编译完的不就在这个B目录下面吗?是吧?诶我还带着你去看过吗?说这个类路径的时候是不是说过它你看这里面不就是我们的编译完的class文件吗?对吧?那么它保存到什么地方了呢?它保存到了这个里面。com看到没有来注意点com song,然后呢,Process,这里面有个Dollar processing.class看到了吧?这就是我们动态生成的那个代理类啊,但是。
03:34
不好的是什么呀,这是一个class文件啊,如果你想看到它,你还得成什么呀,反编译对吧?啊,所以这个还是比较麻烦的哈,OK,那怎么反编译啊,你觉得有相对应的工具吧,你你不要自己去做这个事是吧?累死你啊对吧?我们就安装一些这个相应的工具啊,然后呢,我这个ecl里面呢,我已经装过一个反编译工具的啊,大家可以去看一下,我装过一个这个反编译工具啊,但是我具体在哪我给忘了啊,我看说一下是吧,这里面不能写中文吗?好,你看在这是吧,看反编译器看到没有对吧?我是提前装过这样的一个插件了哈,反变译器能理解吧,装了这个东西以后呢?呃,具体怎么装以后我可以跟你说一下哈,装了这个东西以后呢,我们可以怎么做呢?你要看好了啊,就是你在这个类上面呢,就是找到你生成的这个动态代理类,然后呢,右键有一个open face,然后。
04:34
我们通过类反编译查看器打开看到了吧,你们是没有这个选项的哈,你必须装了以后才有这个选项来打开,打开以后你就看一下,这就是人家帮我们生成的那个动态代理类,首先从第一行上面来看,好像跟我们写的也差不多,继成了它实现了这个接口,对不对?好,再来往下看啊,你看这里面是不是也有这样的一个构造器啊,有没有。有吧,这个过道器不写是不行的,如果你不写它,你完成不了这个过程。
05:05
因为你没办法把那个H给它传过来呀,理解吧,OK,所以这个构造器也有,然后呢,它定义了这么些个方法,你看M1 m2 M4 M3 M6 M5M0对吧?定义这些方法是干嘛的呢?注意在最下面它有一个方法的判断,你看了哈,Class加for name,然后呢,它把这个object加加载进来,然后呢,Get method获取到这个ES方法,然后呢,把这个E的方法呢,给你描述成一个什么呀,描述成一个M1了,把这个出词券描述成M2了,还有一个叫什么呀,Object Jack里面的哈奇code描述的M0了,也就意味着M1 m2M0这几个方法它是不会做动态代理的,因为他要去判断一下我们现在写的这个类,其实它默认是不是也继承了哦战了对吧?那么object战里面最关键的三个方法,我是不是也会继承下来,那三个方法我需要给你代理个,不需要说成它又做了一个判断,像这几个方法我就不再去管了,而我们真正的方法是什么呀?M4 M3 M6,你来看是不是我们的注意还有一个什么呀,M5是吧?
06:05
这个应该是M0,它没有没有没有编译出来,你看到没有,反编译嘛,肯定会丢点东西嘛,这很正常的是不是啊,那完那我们就来看啊,M4M3M5M6就是我们的是不是这几个方法呀,对吧,他都给你描述的这个这几个M4M3M6M5 OK,好这个我们知道了以后再来往上看,你来看每一个方法,比方说这个我们找到加的这个方法,加号法,你看到没有,这里面最核心的一行代码就是什么呀?super.h点你work看到没有,把当前对象,当前对象是谁呀?不就是你这个代理对象吗?传进去,把M3传进去,M3是谁啊,你往下翻,M3是谁?不就是我们的ADD吗?是不是ADD这个方法对象对吧?把M3又传进去了,M3传进去以后,我们再来看,他又把我们的阿法零阿法一是不是扭成了一个具体的一个数组啊,是不是阿尔法零阿个一啊,看到没有,是把这个我们具体的。
07:05
这个参数又给你什么传进去了吧,对吧,所以说呢,我们就能看到它这个动态单元的底层呢,就是这样一行代码,然后呢,就能调用到我们具体的这个隐卧和方法里面了,那你看一下我们刚刚去模拟实像的那个跟它一样不一样一样的。理解了吗?那么嗯,带着大家去看这些东西是为了什么呢?第一个帮助你更好的去理解它,你怎么把这个整个动态代理给它穿起来,怎么去执行的,帮助你去理解它,第二个你得相应的知道一点它里程的实现明白吧,这样的话呢,等你们将来,呃,不管是你面试也好,或者是工作中你实际上去用也好,对你肯定都是有帮助的。听懂了吧?啊,如果说你在面试的时候,他问到你动态代理相关的东西,你能把这个东西说的特别清楚。对吧,基本上这个问题就可以给你加分了。
08:02
真的我不骗你啊,其实在这个企业里面,你你到你们将来到公司以后啊,你们可以试试是吧,你找那个Java开发的那帮程序员,你随便拉出来一个,你问问他动态代理底层怎么实现的,不一定有人能说的出来,他可能会用这个东西,他会用吗?他一定会用,而且用的特别溜,明白吧,因为他是实际操作过的,但是呢,你要说让他把这个很细节性的东西说出来,他不一定能说的出来。能听懂吗?所以说呢,大家呢,就可以把这个东西提前的把它都去什么理解理解,把它记一记,这个将来你去面试的时候,你要是能把很细节性的东西都说出来,那就很了不起了。听懂了吧,可能一个问题就搞定了,行,我们来聊注资是吧?啊,你觉得不可能吗?很有可能的是吧?啊你你经常就是你去公司面试的时候,可能就一个问题问完以后呢,如果你答的非常好,那行吧,我们来看看工资吧。
09:03
真的有可能的啊,当然哈,像这种问题的话,一般是什么问题呢?这个公司正在遇到的问题,他解决不了的,他要去面试人,面试的时候他问你来,如果你遇到这个问题,你怎么解决,其实你说了一大堆他也听不懂,但是他感觉你能解决对吧?那么你就是他正在正需要的这个人啊来吧,谈谈工资吧是吧?啊就开始给你各种发饼是吧?啊对不对啊,告诉你我们啊,啊三年要上市是吧?啊对不对?行哈,啊你们听到这些的时候,你们一定要表现的很淡定是吧,你就说我经历过是吧,还有人比你说的夸他了,一年要一年要上市的是吧?啊,我都经历过了,对不对啊啊你提到这个你要很淡定是不是,面试的时候我告诉你千万不要表现,比如说我本来我想要15对吧,但是呢,我就鼓足勇气,我要了个16,他还给我了,你千万不要表现的很开心,我告诉你。
10:01
是不是啊,可能他心里面对你的期望是20,他比你更开心啊,行了哈,这是我们到时候很淡定是吧,淡定啊,我看开了这个东西,嗯,我觉得也就一般啊,我不是很满意,得给他这样一种感觉,是不是啊,你要是觉得很开心是吧,那么他第二天面试一个跟你差不多的人是吧?啊,他可能就不要你了。对不对啊,行吧,嗯,这个大家能理解了吗?可以理解了吗?可以了吧?啊,你要再理解不了是吧,我也没办法啊,我这该说的都给你说到了对吧是吧?那么大家下去以后呢,注意哈,呃,这个东西呢,呃,你们下去以后不用去装那个反编译工具啊,我把这个给你拷贝数据给你存起来,你自己去看,这样做行吧啊啊好多同学说老师你这有障碍啊,我没有反编译工具,我看不了啊,那我就把这条路给你打通了是吧?给你存到哪呢?我就给你存到我当前的这个。
11:07
这个process下面你看好了哈,我就存到我这个process里面,然后在这里面呢,我去有一个class啊,当然我就不能再叫那个PROCESS0了,我是自己写过一个PRO0那个类啊,对吧,那我就叫什么呀,就叫这个Dollar pro00吧,行吧,哎,PRO00啊来finish,然后这里面的话呢,我们就来把这个类给它放进来,然后呢,呃,这里面肯定是有语法问题的哈,然后这个语法问题你们就不用再去管了,就是你自己能把这个啊零零啊,我大概能改一改。这里面你看这个反编译肯定是有问题的啊,没有全部反编译回来啊,呃,那么这些东西你就不用再去纠结了,反正你看这个是能看得懂了吧,对吧?诶我就把这个放到这儿,那么下去以后的话呢,你就结合上,诶我给你反编译回来的这个东西,你再去理解一下我们的动态代理,它到底是怎么执行的是吧,其实写代码写起来,这个动态代理写起来简单吗?特别简单,你就把这个流程记住就行了,我总共要需要写什么东西,把这个记得很清楚,你就能把它写出来了,但是更主要的是我们一定要去明白他这个执行的一个过程,明白吧,啊,不要给大家这个讲了这么多东西啊,你没用上是吧,你一定要就是拿上我给你留下的这些东西,然后呢,你自己去把它好好的研究研究很重要的这个理解了吗?啊,你看我大伙差不多快花了一下午的时间就在说这个东西相当重要,现在我们讲马上要讲spring的AOPP就会用到它,而且以后我们在别的框架里面,像买里面,我们也会用到动态代理,呃,如果说。
12:47
现在你把它没有好好的学一下,然后呢,呃,这个呃不是很清楚的话,到时候可能你也就不知道了,对吧?啊很重要的啊,那行吧,啊多的呢,我就不再说了啊好,那么最后的话,我们再回到我们刚刚提出的这个问题里,给大家看一下,现在这两个问题得到解决了没有得到解决了吧,为什么能转换成我们这个接口类型的,那就是因为你看它确实是实现了我这个接口的,这个没有骗你们对吧?那为什么要调用引用方法呢?就是因为我们这个方法里面有一个super加H战block。
13:21
解决了吧,OK,在乎了啊,就是对于某些同学来讲,他觉得这个东西特别难,那么最基本的一个要求就是这个。你怎么写,你必须得知道啊,你就死记硬背,你得把它背会了啊,怎么写一定要知道,然后呢,就是有一个结果啊,让你们记住了那个结果,这个一定要记住,代理对象调用代理方法一定要转到我们的应用方法里面。对吧,这样的话,只有你知道了这个东西你才能知道,怎么就跑到我自己写的这个代理里面了呢,是吧,就是这个结果,你可得记住你才能联系到这个引问方法明白了吗?OK。
我来说两句