00:00
OK,来吧,那么我们把这个介绍完成以后呢,我们接下来就在这个类中啊,我们去完成一个动态代理的一个什么编写啊,好,那么如果说你想去做一个代理,我们需要关心什么呢?注意动态代理我们要关心的是这么几个事儿啊,第一个目标对象是谁对吧?你一定要明确我现在要为谁去生成这个代理,我要去代理谁。能听懂吧,哎,这个你一定要明确,我要去带领谁,理解什么意思吧,OK,说错了,这是非常重要的一个对象,然后呢,知道这个对象以后呢,我们要关心的就是,诶如何啊,就是什么呀,呃,如何获取我们的代理对象啊,这是第二件事,第三件事也是我们动态代理整个过程啊,需要去编写的就是代理要做什么,诶你就奔着这三件事去做就行了,听懂了吧,诶就奔着这三件事去做就行了啊所以说呢,首先啊,我在这个类中的话呢,我先去声明一个我们所谓的目标对象,目标对象是谁呀。
01:10
谁呀,我现在是不是希望给谁啊,是不是希望给我的注意了啊,我希望给谁啊,是不是希望给我的这个算术计算器去做一个代理啊,然后呢,在他这个加减乘除的功能上,是不是给他扩展出来一个日志的功能啊。能明白这个意思吗?OK,好,说说呢,现在的目标对象是谁呢?就是我们的算术计算机对象,来,我来定义一下,好,A calculator,我定义的就是我们的target目标对象能看明白吗?我通过接口来声明的,看懂了吧?有问题吗?看不懂啊,这个看不懂吗?啊,这个是目标对象,你知道吗?啊,对吧,那我通过它的副类型接口来声明一个它的变量不行吗?能看懂吗?这个只不过现在对象还没有呢嘛,一会儿我想办法把对象给他搞过来,对不对?好,那咱们把这个对象给它搞过来呢,我是这么来想的,反正啊,这个里面的话呢,这个类我将来是要去创建一个对象的,因为在它里面我会提供一个方法,就是获取代理对象的一个方法,那如果你想去调这个方法,你就得有这个类的一个对象,那么有这个类的一个对象,你就得去拗它,你要拗它你就得执行一个构造器,所以说呢,我就给它加上一个构造器。
02:33
在过造期里面,你再去创建我这个对象的时候,注意我就要求你必须要给我传递来一个目标对象,我才能知道我当前要为哪个目标对象进行代理,听明白了吧?所以说呢,我在这里面我就直接定义好一个magic calcul target,然后呢,你将来把你要代理的这个目标对象传进来,传进来以后呢,我就把它复制给我的当前的谁啊,插别的上面,好,你先不要想这个对象怎么创建的,但是呢,现在这个代码你能看懂了吗?你传进来一个对象就是一个目标对象,目标对象呢,我就给它复制到我当前的这个成员变量上面,这样的话呢,我是不是相当于就给它保存起来了,能理解了吧?诶,给你保存起来了啊好,那么这个想法以后呢,我们再来往后看,接下来我就要去提供一个方法,就是什么获取代理对象的方法,好那么这个代理对象的话,我们写一下代理的话呢,生成以后我们应该是一个object类型的一个对象啊,然后呢,我们就是get一个pro。
03:34
啊,Get process process就是代理的意思啊,啊,我希望将来我一定要用这个方法,我就能拿到一个代理对象,那么在这里面我是不是要给人家去生成代理对象啊,对不对?OK,来注意,首先我先定义出我的代理对象,代理对象是一个什么类型的呀,注意object类型的嘛,是不是object类型的呀,对吧,因为我不确定我要给谁生成代理,因为动态代理嘛,对吧?其实如果这个地方你想显得更加的动态一点的话呢,这个位置你就不要定义具体的类型,你也定义成object Jack类型的,能明白吧,但是定义成object Jack类型的话,大家就不好去理解了,我现在呢,就先给他写的不是那么动态,最后的话再来给你去解释一下,如何让他更加的动态一点,能听懂吧,所以说这个位置的话呢,我们就代理对象了吗?我就给你定义成一个object价类型吧,啊来我就是一个pro,这就是我的一个代理对象,能明白吧。
04:34
那么这个代理对象我怎么给它创建出来呢?那我们就要用到我们刚刚提到的pro这个类,在这个类中有一个方法专门用于帮我们生成代理对象,能看懂吗?能能听懂这个意思吧,诶,专门帮我们生成什么代理对象的,好,那我就使用这个方法,怎么用呢?来注意,那就是pro,就等于大写的pro这个类,它里面有一个new pro。
05:00
能看明白吧,哎,用process instance OK,那么我们把这个给它创建出来,好,你先不要去管这三个参数啊,最终的话呢,我再把这个一个pro,那你看我将来调这个方法,我是不是就能拿到一个pro对象了。能看懂吗?好,那么接下来我们就来看一下,诶,这个process类中的这个方法里面的三个参数分别是什么意思,给大家来解释来,第一个loader,这是一个什么呀?这是一个可拉斯loader对象,什么对象啊?诶类加载器对象,那你说他为什么要让我们传一个类加载器对象啊,啊,因为动态代理啊,那么我就意味着要动态的去生成一个类,那么既然你是一个类,我就得进行类加载吧,对不对?所以说呢,我们就要给人家传进去一个类加载器对象,帮我们去加载我们的动态代理类啊,那就是帮我们加载好动态生成的代理类吗?能明白这个意思了吗?
06:13
能明白了吧,OK,那你说这个load我用谁比较好啊,你得给我一个内加载器吧,哎,注意我们用谁的呢?你看了哈特拉斯load我用谁的内加载器啊,我就用目标对象的感车特拉斯,我就用目标对象的一个什么类加载器能不能行啊,可以可以吧,类加载器只能加载一个类吗?是不是啊,嗯嗯,是啊,类加载器只能加载一个类啊。谁教你的啊,类加载器能加载几个类啊,它不只能不仅仅能加载一个类,能明白吗?啊,它能加载各种各样的类都可以去加载的,这个类加载器这个概念你们不知道吗?没讲过吗?讲过吧,讲没讲过不可能没讲过啊,你下去自己看去啊,反正现在你记住我可以使用我目标对象,就是我目标类就是谁呀,加载我这个类的那个类加载器啊,我使用加载这个类的那个类加载器对象,去加载我动态生成的这个代理类,这个是可以的,能明白了吧,反正你就记住这个地方,它需要我提供出一个类加载器对象,行,那我就给你提供一个类加载器对象。
07:39
听明白这个意思了吧?OK,再来接着往下写好下一个我们来看in the faces这个是什么东西啊?Faces叫做什么呀?接口门带S的吗?人家是多个吗?对吧?啊,我们不就是多个吗?那接口门不就是多个接口吗?
08:02
对吧,OK,那这个地方你说你提供接口干嘛呀?啊,其实注意了啊,这就是我们JDK基于接口的动态代理,他就要我们提供一个接口,为什么要提供接口的注意啊,而且你提供谁的接口呢?注意我们要提供的是什么呀,提供目标对象的所有的接口,那你提供这个接口的目的是什么呢?目的是什么呀?我得看一下你目标对象里面的方法都是从哪些接口实现出来的,能理解这个意思吗?为什么要基于接口来去做动态代理啊?因为你现在来看一看,你这个目标类里面的这些方法是不是都是从这个接口里面来的,那么对于我的代理类来讲,因为我们说过代理类我们从表面上看是只能替代你的目标对象的,也就意味着我得给你造成一种假象,你买的这个东西就是从我手里买的。
09:07
能明白这个意思吧,就是我可以提供给你购买的这种功能,就是你可以直接找我买,但实质上最终卖你东西的是我背后的那个卖家,而不是我这个代理,但是对于你来讲,我就要给你造成这种假象,说诶,你是从我这买的,也就意味着我们必须得让代理对象也能有谁呀,有这个目标对象的功能,但是呢,这个功能是个假的。听懂了吧,这个功能是个假的,只是为了什么让你感觉上是它的功能,但其实是不是的,好,那我们就来想,目代理对象如果说也想有这些方法的话,他怎么办呀?他是不是只要去看一下你目标对象实现了哪些接口,我也去实现这些接口,是不是我们就有了相同的方法了。能听懂了吗?哎,所以说这个位置为什么提供这个接口呢?因为是这个样子的,假如说这是我们的接口,这是我的目标对象,他实现了这个接口,这里面有四个方法,那么目标对象里面是不是就有四个方法,那我让我的代理对象也实现这个接口,我是不是也有跟你相同的四个方法,这样的话,对于。
10:20
外面的人来讲,对于其他人来讲,看到这个代理对象的时候,诶,他也能有加减乘除四个方法,是不是就是相当于有了这个功能了,对吧?但实际上这还没完啊,一会儿我给你是说,那你要是有了加减乘除的功能,这从原理上来讲是不对的,你不可能完全去替代我的目标对象的,对吧?所以说这只是一个假象,最终你的加减乘除还是要执行到我的目标对象上面的,这个大家一定要记住啊,那我们接着往后写,所以说这个地方我要给人家提供好所有的接口,怎么提供呢?怎么提供啊,啊,怎么提供啊,那不就是我们的目标对象点get class.get in faces吗?这不就获取到所有的接口了吗?对不对啊,来,这是一个class类型的一个数组,In the faces是不是拿到了,看到了吗?来,把这个放进去,OK,这个能理解了吧,来。
11:20
目的是什么呀?啊,目的是什么呀?就是让代理对象啊,保证什么呀,与目标对象都有什么呀,接口中好相同的什么呀,方法,这样的话我才能代领你嘛,对不对?哎,我得让你感觉我是有加减乘除的功能了,能听懂这个意思了吧?OK,好,那么接下来我们再来往后看H,哎呦,这个H课不是那么好理解啊,这个H是个啥呢?注意它就是一个,它就是一个invoc handler的一个什么接口啊,就是invoc handler一个什么接口类型啊,接口类型的对象啊,Handler的什么类型的对象,好,那么我们现在就用到了我们JDK动态代里面的第二个非常重要的接口,他要完成动态代理的整个过程,OK,那我们就来看现在我要给他一个接。
12:20
好,那么这个接口啊,不是不是给他个接口啊,给他们这个接口类型的一个对象,那怎么给啊,你直接去用这个invo汉能溜出来吗?但是我们可以使用匿名内部内版对吧?你看他就直接告诉我使用匿名内部类,OK,行来,那我实现出来以后,你看一下在这个接口里面,我们刚刚提到是不是有个e work方法呀,OK,那么这个引O方法就是我们完成动态代理的整合过程,其实真正的动态代理是从引O方法来开始的,刚刚写的这些东西。都是比较基本的,好理解的,好来吧,接着写啊,都写到这了是吧?OK,那么我来看这个,首先啊,我来问大家一个问题,我在创建,我在调用这个方法的时候,这个H对象里面的work方法会不会执行?
13:12
会呀,再问问一次啊,我在调用process new process instance的时候,现在这个位置,我是不是给了你一个这个invo handle的这个对象了吧?OK,那我问你这个以窝沟方法,就是我在执行这个方法的时候,他以窝方法会执行吗?会不会?会呀。咋执行的呀?会执行吗?啊,你把对象放到这了,他就直接执行这个方法了。是吗?是这个样子的吗?啊,会执行吗?再想想。
14:11
会不会看不出来是吗?啊来,我给你换一种写法,匿名内部类的写法相当于什么呀?是不是相当于有一个class,比如说我就叫什么my invo,看了我就随便写写了啊,这是我的一个类,能看懂吗?写全一点啊,是不是相当于有一个类,然后呢,我去实现了什么呀?这是什么方法,方法里面不让我写吗?不让我写吗?这是方法里面吗?方法里面我可以写了呀。看看是不是有问题啊,这里面不让我写类吗?诶,那我的局部内部类怎么写啊,方法那种方法中也可以写了呀,所说不行的啊,但现在好像就是不让我写是吧?真不行,静态的呢。
15:26
还不行,这什么原因啊?我刚才写到哪写到这里这个地方了吗?还这个地方神奇了是吧?类中不让我写方法啊,不,方法里面不让我写类是吧?啊,那这样吧,我们先不纠结这个了哈,那行吧,那我写在外面吧,外面总让我写了吧?啊,这里面总让我写了吧,好,Handle。
16:08
然后呢,去实现我们的啊,因为可是hand能看到吧,来,那我实现了这个接口以后都注意了啊,我实现了这个接口以后,这里面有一个疑问方法我识别实现出来,嗯,好,那也就相当于什么呀,我在这个位置看了哈,我不写这一堆了,能看明白吧,那我在这个位置,你看他要求一个in,我c handler一个对象,那我就把我的new一个my invoc handle了,放到这,我来问你,我执行这行代码的时候,我的这个方法会执行吗?会不会执行,现在能确定了吗?会执行吗?不会执行吧,对吧,跟他有啥关系啊,你这是对象是对象,方法是方法,你执行这个方法,你跟我这个方法有啥关系吗?
17:00
那你这个你能理解,我写成刚刚的这个匿名内部类,你就理解不了了,写成这个你就理解不了了,那我问你,我在执行这个方法的时候,他会执行吗。会不会不会执行啊,记住了吗?哎哟,这最基本的一个语法啊,现在能明白了吧,OK,不会执行啊,不会执行好,那么接下来给大家解释这个引忘的方法是干嘛的呀?来听我说了哈,你先记住一个结论,好,记住一个结论,什么结论呢?叫做代理对象调用方法,能明白吧,调用什么呀,调用我们的代理方法,会回到什么呀,会什么呀,回来什么呀,调用我们的英问方法,你先把这个结论记住了,能记得吧,先把结论记住了啊好,这个结论呢,大家一定要记住,就是呢,你可以理解不了整个过程,但是这个结论你必须得记得住,要不这个动态带着你就走不通了。
18:01
听明白了吧,先把这个结论记住啊,OK,那么记住以后呢,大家注意,接下来我们就要给大家具体去解释我们的引work这个方法,其实现在大家注意我们的代理对象能生成了吗?完全没问题,代理对象现在已经可以获取到了,但是你拿到代理对象以后,你接下来是不是做这个代理的过程啊,就是你这个代理对象你能做什么事?诶,这个我们是要在这个隐窝和方法里面去编写的,现在我们还没有把它完成,但是对于我们获取代理对象来讲,我现在这个方法已经写好了,我完全是可以把代理对象获取到的,只不过你拿到的这个代理对象没有功能。听明白了吧,OK,好,所以接下来我们就来给大家去讲代理对象,他如何来完成我们的代理啊,就是我们的引文方法的一个编写啊啊。
我来说两句