00:00
好来接下来的话呢,我们就来研究一下它这个动态代理底层到底是怎么来去实现的,OK,呃,那我们研究的话呢,也不能很盲目的去研究啊,我们带着这么几个问题来去做,呃,首先第一个问题的话呢,其实刚刚已经给大家去说到了啊,就是我来写到这个地方吧,啊,我们带着这个问题呢去啊研究啊呃,我们先来解决第一个问题,第一个问题呢,就是我们刚刚说到的这个代理对象,哎,能否转换成我们的好目标对象的类型,这个能不能,这个可不可以啊,不行吧,诶刚刚我们已经说到了啊,就是呢,你看这是我的目标对象,这是你的代理对象,然后呢,我们可以把它转回具体的啊,这个不是对象啊,转回具体的什么呀?啊类型啊,转回具体的一个类型是可以的啊,不是转回具体的对象啊。
01:01
啊啊,所以说现在大家一定要去理解这个代理对象跟这个目标对象他们的这个关系是什么关系啊,他们两个就是一个兄弟关系,对吧?啊,你可以去找他们共同点,共同点是什么呀,他们都去实现了相同的接口,也就意味着我的代理对象我也可以找回到那个接口类型,我的目标对象呢,也可以是一个接口类型的,对吧,相当于就是什么,他们就是一个兄弟,然后呢,他们有共同的一个接口,能明白这个意思了吧?OK,这个还是比较好理解的啊好啊,那么但是呢,这个问题呢,我们也需要去带着去研究啊,你得去看到诶,怎么就是代理对象跟目标对象都是实现了相同的接口了呢,我咋没看到啊对吧?所以说一会儿呢,我们也要去看得到他啊,然后第二个问题就是我们刚刚说到的代理对象。调用我们的代理方法,好,我让你记住那个结论,还记得吗?为什么会执行我们的,因为看中的方法好,这是我们要去研究的啊OK,呃,那这样来说啊,我们就来给大家这个多说一说哈,呃,首先呢,我来给大家去模拟的,去写一下它底层动态代理是怎么来去实现的,明白吧,就是它底层那个动态代理类,就是我们生成的那个动态代理类,它是一个什么样子的,我来给大家去模拟一下,好呃,那我把这个东西呢,写到哪呢?写到我们这个process这个位置吧,好吧,写到这个类里面啊,就是来我们注意了啊好,我们来这个好模拟底层生成的这个动态。
02:50
代理类它是什么样子的,大家注意啊,首先的话呢,那我们就要去看到我这个动态代理类是一个什么类型吧,对吧,怎么看到它呢?那你这个位置不是拿到具体的这个代理类对代理对象了吗?那你就可以来输出一下啊,来输出一下,输出什么呀,proceed.get class get name是不是具体的类型,嗯,对不对,那你就来看一下它到底是谁啊,来运行一下,好,你能看到它是一个com点送点pro.Dollar pro0看到没有,是不是这个类型的,我告诉你这个家伙就是一个代理类,代理类型,然后的话,呃,你们再去运行的时候呢,可能你们不是零啊,你可能是别的数字啊,什么12345678都是有可能的啊,这个你不要纠结,说老师我跟你的不一样啊,这个它是不可能一样的啊,有的同学可能跟我的一样,有的同学跟我的就不一样,对吧,有些时候我运行也也不是零能明白吧啊,这个它是一个,呃,底层给你生成这个动态代理的时候,他会自己做一个处理的啊,我们知道就行了。但是前面的可。
03:50
类都是一样的,理解了吧,OK,那我就知道你就是一个Dollar process0,好,那我就知道了,那我们在这地方写的话,就是它有一个类叫做什么呀?Class processing是不是这个类啊。
04:06
这个是那个代理类嘛,对吧?OK,那么这个代理类呢,大家注意,我们在讲那个pro这个类的时候呢,给大家说过,它是所有代理类的一个副负类,看到没有说过吧,是所有动态代理类的一个负类,那么就意味着你既然是一个代理类,那你必须得去继承我的process这个类。能明白这个意思吗?OK,并且我们说过代理类是不是也要实现我们目标类所有的接口啊,OK,因此呢,他还要再去实现谁呀?Employment,我们的magic ccul这个接口好到的是pro里面的这个啊,OK,这就写好了,那么相关以后的话,大家注意实现了接口以及去继承了这个类,那么我们要在这里面去写什么呀?添加未实现的所有的方法,你看是不是是我们这四个方法给它实现出来了,对吧?除了这个之外的话呢,还有一个东西,你看现在是不是还要报错的呀,为什么报错呢?说他必须要让让我们去干什么事啊,去写出一个构造器来,能理解吧,那我们要什么按照它的提示我们来加一下啊,我把这个过导题加进来,好,你看我就把这个过导题加进来了,看到了吧,OK,这就是它要求我们去写的,好,那么其实这个就是我们底层的一个什么动态代理类,当然还没写完啊,那我就来给大家去分析一下,首先这个构造器大家注意,就是我在创建我代理对象的时候,是不是要调用这。
05:27
这个构造器啊,而且你注意我提供了这个构造器以后,默认的这个构造器还有吗?没有了啊,那也就意味着你在创建我这个代理类对象的时候,必须得传递去一个invo handle了,是不是这个H啊,对吧?那么这个H哪来呢?我告诉你它底层呢,就要把我们的这个H,就是你在创建代理类对象的时候,你看这不这不创建代理对象嘛,对吧,虽然说我们看不到它底层具体的实现,但是我告诉你,它会把我们这个地方的这个H呢,给它传到我们的这个里面,能明白吧,那也就意味着这个H其实就是我们自己创建好的那个invo handle了,然后他又做了什么事呢?他又把这个H呢给到了负类里面了吧,是不是,那我们来点到负类里面,那么来到我们的pro这个类中,你就能看到它把我们这个H呢赋值给了当前对象的一个H,那么我们来看看它是谁啊,你点一下发现它就是一个。
06:27
英文可handle德了,看到没有,就相当于做了什么事呢?我把我创建好的英文可handle了传到了代理类里面,代理类里面呢,又从他的构造器里面呢,把这个H传到了负类里面。能明白吗?那么这样的话呢,我父类里面的这个H,其实就是我们自己创建的这个H,这个能联系上了吧,然后知道了这个以后呢,我要告诉大家,那你说在代理类里面的这些方法里面,他做了什么事啊,我告诉你这里面其实就这一行代码,称什么呀,称super.h点给work就是这样一个代码,然后当然了,这里面需要传参数的啊,传什么呢?首先传一个代理对象呢,就是这,然后呢,还需要去传我们当前的这个方法对象啊,就是呢,他必须要去传一个方法对象啊,我就不再给你具体去写了哈,因为我要把这个对象给它创建出来,我就不写了啊,就是直接给你应变码啊方法对象,然后呢,还得再去传一个什么呀,方法参数,它其实每个方法里面就这么一行代码。
07:30
动态代理的这个代理类里面,每个方法里面就这一行代码,那么现在我们就来去分析它,我现在从我的慢方法里面,我拿着我的动态代理对象去调了一个addd方法,什么对象就调用它什么方法吧,那么这个对象我们知道它是那个Dollar pro里就是我们这个类型的一个对象吧,这个类型的对象你调用ADDDD方法,那么它是不是就要执行到我的这个ADD方法里面,而在这里面的话,注意这就是一个假项,有没有真正的去算加的功能啊,没有,而是通过super.h.in work,那么大家注意这个H是谁呀,我们从这传到了负类里面,然后呢,这个呢,又是我们自己创建的那个H,也就意味着现在super的H,说白了是还是我们自己那个H啊,那么也就意味着这个H是谁呢?这个H就是我们在这写的这个H是不它啊,对不对,OK,好,那么。
08:30
他就会什么去调用它的VO方法,也就意味着它要执行到我这个invoc handler里面的VO方法,就回到了这个位置了。能听明白了吧,那么回到这以后呢,在这个里面我就可以完成我动态代理的这个整个过程了,怎么代理的呢?你这里面写什么,那我就是怎么给你代理的,其中在这里面最关键的一行代码,就是我们必须得让目标对象去执行它的目标方法。
09:00
为什么呀,因为在代理类里面,它就是一个假的,你的那个加入那个功能运行了吗?没有,所以说呢,我们一开始讲动态代理的时候就说过这样的一句话,现在大家再来回头看一看能不能理解。啊,什么话呢?注意在这啊,啊,我们通过一个代理对象将原本对象的包装起来,然后呢,使用代理对象的去取代我的原始对象,任何对原始对象的调用呢,都要通过代理,那么我们先来理解这句话,我对原始对的一个调用,就是我现在想去做加法操作了,我们是不是通过一个代理对象开始的,对不对?OK,最终呢,注意了啊,代理对象能够决定是否以及何时将方法的调用转回到原始对象上,那么这个又是在哪体现的呢?就是我们的这样一行代码,你看我是不是在这个位置把我们的对方法的调用是不是转回到了我原始对象上面了,也就意味着真正的加法是在这来操作的,而其他的你看到的那都是一个假象。
10:14
能明白了吗?能听懂了吧,所以说诶,我做了这半天,我绕了这大半天,其实实现了一个什么功能呢?就是把目标对象的那个加啊减乘除这四个方法调用给它提取到了这个位置,然后呢,我就可以在这个方法的前后去记录我的日志了,听懂这个意思了吧?哎,这就是一个动态代理,那你看这么一分析的话,是不是也没有那么难啊,那么难不难吧?哎,你就能理解它是什么意思了,好,那么这时我们自己来给大家去做了一个分析啊,那么它它底层大概呢,就是这个样子的啊,我把这个注释一下。
11:00
好,我把这个呢给大家注注释一下啊,就是我们这是一个假设啊,那还是一个软成一个零吧,好那么大家把这个理解一下,那么接下来啊,这个我们是自己来模拟去写的,那我接下来我让你看一下真正的动态代理类是什么样子的,好那么我们先停一下啊。
我来说两句