00:00
刚才同学说呀,说这个太懵了,当然这个是新知识点,你没接触过吗?而且呢,他用大量的反射机制吗?如果你反射你会了。那这块就好理解了,如果你反射呢,你掌握的稍微弱一弱,那这。你在全能懂它肯定会比较难,这是肯定的,在讲的时候我就跟你说了,我说这块比较难嘛,反射机制你会了,这一块呢,你才能看到比较懂,但是这块呢,我跟你说了嘛,不需要你把它掌握了,不需要不需要,因为我们讲的课程时候,我就说了嘛,你只要掌握两个东西就行了,一个呢什么事都要代理。谁有创造的能力,第二说他能干什么就行了。就知道这两个就行了,我不需要你把代码掌握了,不需要啊,不需要这个代码呢,一会儿呢,我会通过这给你写,在写的过程中呢,我会用到这几个类。所以呢,我把它给你介绍一下呀,也知道它是什么,你就能大概知道它什么意思就可以了,我不需要你掌握它,因为在后面的课程中我们也不用,也不用,但是这个概念你得知道有这个概念,因为在后面的课程中呢,我们会用到这个概念来做些事情。
01:15
你知道它这个概念就行了,我不需要你找这个代码不需要啊。好,那这个参数呢,也给你讲完了,三个类呢,给你介绍了,分别是我们的叫隐窝handle了method,还有proy,下面我们来看一下应该怎么去用这个三个类呢,来实现一个动态代理呢?我给你看一个例子。往下来,我们来看看实现动态代理的步骤。应该到几了,到三就行了,一个到三。实现动态代理的这个步骤,第一个呢,我们要创建接口,来定义你的目标类要完成的功能啊,要完成的功能就你想干什么,得有接口,第二步我们来创建目标类,我们要实现这个接口,这是肯定的。
02:17
跟之前的静态代理方式是一致的,一样的有接口,有目标,然后第三,第三是我们要创建handle了,接口的实现类在VO方法中来完成代理类的功能,这个功能呢有两个,第一个调用目标方法,目标方法第二个我们要增加功能,就是我们创建invocation handler接口。它的时间内啊,第四个后照,那就说使用我们的proxy类。
03:06
它的静态方法来创建代理对象啊,并把返回值转为接口类型就完了,就这么四步就能实现了,这四步之中我会用到我们刚才介绍的这三个类啊,这三个类。那现在呢,我给你实现一下,来看看JDK它的一个实验的步骤,实验的方式,就这四步就完事了。好,那我来实现一个。我们来创建一个新的model。Model。好,那我们这个叫做CH0303,我们讲的是动态代理啊,啊动态的代理。
04:06
Finish OK。我们看一下零三应该怎么实现。那第一步呢,有接口啊,我们先创建一个包,包里存我们这个接口,看北京power note,我们就叫做service好了啊,Service我们还是呢,用我们之前那个买U盘那个为例子,因为买U盘那个静态代理呢,大家都比较好理解嘛,我们还是用这个。买U盘这个东西啊,我们这儿首先呢,还有我们这个UBSHE,还有它。那我们来创建这个接口,USB shell接口叫做USB shell,它的接口里边呢,还是定义我们这个方法,它的反应值是一个float shell参数呢是一个amount,代表的是数量,这是我们的接口。
05:01
目标接口下面呢,我们来创建这个接口的实现类,也就是说我们的目标对象。目标对象,那我们叫做USB factory factory。我们把它放在这个,我们也叫做吧。啊,放在这个包里边,然后让它实现的是我们的叫做USB shell ctrl加O。这是我们的目标类,目标类有自己的功能啊,这是目标类,目标类跟以前一样,它返回值呢,我们是一个八十五一个U盘呢85。啊85这是我们的目标类,它是我们的目标方法,我们在这呢来输出一下说呢,这是目标类中。
06:06
啊,执行了shell目标方法啊,就完事了,这是目标类之后呢,我们要创业代理。这个怎么创建呢?以前呢,静态的时候你不得写这些类吗。现在这些不用你写了,交给JDK帮你去做,JDK怎么做,往下来现在我们要创建是。动态代理在这时候你要注意前两个步骤这是完成了吧?下面是要创建invocation handler接口的实现类。它代表是你动态代理要干的功能,调用目标方法增强功能,那我们在这来实现的是一个代理类的功能实现,功能实现啊,那这个我叫做handle了,包吧类的名字我叫做michell handle。
07:08
他得去实现JDK中标准的接口叫vocation handle,这是必须的。CTRL加O实现唯一的方法叫Mo,那这个我们是必须实现。Invocation handler接口必须实现它。来完成你代理类要做的功能啊,要做的功能,要做的功能。那你带眼类它要完成什么功能呢?第一个调用目标方法,这是第一个,第二个呢是执行功能增强,主要就那么两件事情啊,这是我们的调用处理器引和里边去干这两件事情,那你看是把这仨参数啊,刚才跟你说了代理。
08:09
目标方法,目标方法的参数。那现在我们要执行目标方法,把你的代理类的功能写在这儿。对比的静态代理。静态代理中,我们看啊大眼类是不是干这些事情啊,你把它拿过来挪到这儿,挪到这儿,你现在要把这些代码的实现。变换一下形式。首先第一个。调用目标方法,调用目标方法,这时候你要注意的是,在我们本类里边,这个对象我没创建,没有它,没有它,那我要怎么做呢?我们要使用是这个method来代替它。这句话注释掉这么用。My in。
09:01
它是代表是目标方法X是目标的参数,参数就放到我们的invo之中,哎放到这儿,因为刚才我们说了嘛,这个invo是俩参数,第一个是对象,第二是参数吧,参数就是它。那么这个对象是谁呢?这个对象是动态的,动态的我们需要传入进来,在这儿我们定义一个object target,估值是一个空,我们使用一个构造方法来把我们的目标啊传进来。这我们说这是动态代理,你的目标对象是活动的。是活动的,它不是固定的,不是固定的啊,它需要呢,传入进来啊,传入进来。
10:04
那就是说你传入的是谁,就给谁创建代理,那这样的话,你这个代理就会创建很多嘛,因为你穿的是A。给A创代理,你传的是B,就给B创建代理,这样就可以很灵活了,那此时呢,这个他给的就是目标对象啊,这是目标对象。给目标对象去赋值啊,它的目标对象拿过来吧,放到这,那这就是表示我们要执行是这个对象的方法呗。目标对象发使用它的方法,它有返回值,反值母定在外面这啊RS初值是一个坑。
11:01
这是res等于它。那这句话呢,就是用来执行目标方法的,执行目标方法就跟这句话是完全等价的,但是这个目标对象是活动的,你传的是A,就执行A的这个方法,你传的是B呢,就只是B的这个方法,这样你的目标对象就是活动的了,他可以给好多个目标对象来进行创建代理了。就是目标方法执行,然后这块的功能增强吗?增强是加价格,加价格的话,那我们叫功能增强,这是给个优惠券,这价格的话,这个怎么处理呢?我们把这块呢也改造一下。加价格,那首先如果res不等于空,说明你得到了这个价格85啊,然后我们进行一个强短lo price。
12:04
啊,等于float RS强转成float float等于price加上25,然后res等于price。这样的话,这个res不就是最终的加了25那个价格吗?然后这是我们的增强优惠券,最后返回的是res。这个I就是我们增加后的这个价格啊,那你看我现在这个方式跟之前的静态代理中,它的基本的功能完成是不是一样的,只不过呢,我们变成了这一块是。用的是shell来进行调用,换成的是method的调用的方式啊。啊,等一下啊,这是method invo执行目标方法,也就是说我们用一个这样的语句来整个把它替代了,把它替代了啊。
13:07
这个目标对象是活动的啊,是活动的。这是我们的VO handle了,他就这么写就完事了。你的静态代理中要干什么?他同样干什么?好,这写完了,这是我们的第三步。在这啊,看最后一步了,最后一步咱们把这个带一定要串出来呢,第四步往下来啊。第四步,我们这么做就行了。啊,在成语中我们来创建一个man shop play就完事了。里边呢有一个主方法卖,在这里呢,我们要做的是创建我们的代理对象。我们要使用的是block c啊,那看它怎么用呢?它是静态方法,叫做new。
14:05
还有三个参数。刚才我们说了这三叉都是什么类加载器,然后是类的接口,还有是有变成handle了,那既然需要我们这些参数,把它们准备一下吧。我们要给的是目标对象代理,所以那第一步这块呢,我们要做的是你得把目标准备好啊,创建目标对象啊,这第一步。目标对象呢?那我们成立中。是,这个叫做USB。好,Can,那么叫new,一个USB can出吧,这就完事了,但实际上呢,大家注意我这个目标对象是不是有一个接口。那我现在可以这样来定义变量吗?可以吧?USB shall factory等于USB factory,这么做可以吧?
15:03
用一个接口来指定这个对象,这是没问题的,肯定是可以的。如果你觉得这种方式你不能接受,那你就这样做,USB in fact。X等于new这道肯这么做也行,它是等价的,但是有接口的时候呢,你这么定义会更加的合适啊,这合适。这是我们的目标对象,然后接下来第二步我们来创建invocation handle了,对象你得有它呀,因为我要用到它嘛,它是一个invoc handle了,好,我就要看到了,然后new一个谁呢?My she handle了,参数是目标,把factory传进去,那现在我们要做的是给他来创建代理,他的目标就传进去了。
16:00
你这传递的是FAY,那你在程序中注意那这块就只有是那个FAY的那个方法了吧。你传谁就执行谁,你传谁就给谁代理。好,这是我们创业。你handle了,然后这是第三步了,第三步这块就是。创建代理了,创建代理对象。New instance第一个是类加载器,怎么获取呢?是这样做的,是factory.get class get loader这个写法是固定的,就是这么写的。我们要获取这个对象的加载器啊,这样就能超这个对象了。第二个呢是接口,是我们这个factory它所实验的接口怎么写呢?还是反射就行了,At interface。这就是我们获取那个接口。
17:00
这样就行了,所以说你也不用过多的去想啊,为什么这么写,这个语法规则你当时固定就完事了,第三个是谁。第三个是这个in handle了吗?所以第三个你放的就是这个。看了对象放进去。我们这个静态方法是有返回值的,它的返回值呢,因为它反值实际上是个object。在这呢?这个object,这个object我们不能直接用,我们先把它转成接口,我这也说了啊,看这。转成接口,转成你的接口类型,转成谁呢?USB shell,好,我们这个叫做FY。嗯。相零转换,这就完事了,为什么能转成这个接口,因为你这个目标对象它实现了这个接口嘛,所以你可以转成这个接口。换成它现在这个就是代理对象了,那最后这边呢,我们四,我们通过这个代理可以执行方法,那这个block c点。
18:16
加shell将去一,这有一个返回值是float price,好,我们来输出,通过动态代理。啊,动态代理,代理对象调用方法。调用方法得到的是这个price的结果呀。好,那现在,哎,我们来找一个。好,我们看到这是有结果吧,目标类执行的shell方法,然后返回了淘宝这个优惠券,然后得到的结果是一百一跟我们现在代理。
19:06
得到那个目标,结果是一模一样的。
我来说两句