00:01
那么对于c lab来说啊,这个子类代理,那么它实现的功能呢,就是子类重写复类的方法,然后来完成功能的增强啊,我们用的简版的这种实现。已经完成了这个功能,但是我们来看看真正的实现是怎么个样子啊,而且你要知道cg lab是通过一个自解码处理框架。来转换自解码并生成新的类。那么我们一般不鼓励你直接去。不鼓励直接去使用asm,因为它要求你对字节码的这种结构。要对指令级都比较熟悉,如果你不熟悉的话,那不好搞啊,不好搞,那么指令集的话。你还得专门去找那个指令集的那个映射表,就是这个指令是什么功能,这是好多那个根本也记不住啊,我也记不住。所以的话,这个就是不太鼓励咱们去使用,当然。
01:01
我们在spring框架里面,他给你封装好使用极简单啊,W框架里面能搞定,这个就是我们期待着我们自己手工去实现,有点难,那我们期待着有框架一定把这这一切都包好了。我们直接去调用就行,不要我们这里咣咣咣咣写那么多,不需要啊,那么你如果要咣咣咣咣去写,要怎么搞这么搞。看着那么c lab的这个实现的步骤需要导入,哎,这个价文件这个呢,你们就把它理解为添加W的依赖就行,为什么是这样的,是因为以前我在讲这个课的时候,那么ma是我来讲这个阶段讲在讲动态代理。没还没讲啊,所以我们在用到的功能都需要导包,现在呢,没拿到前一个阶段去讲,我们学完以后这个地方就直接添加依赖就行啊。那么需要添加依赖。
02:01
啊,是要添加啊这个依赖。啊,依赖即可,就这么着了,这是有一个小小的变化啊,那么导入功能以后动态构建此类一定要小心被代理的类,不能是final,为什么?被代理的类为什么不能是final?知道烦是什么吗?翻是干嘛?对,是那个终结者。那么final如果对于变量来说被final修饰,它变成常量不可变了。Final如果修饰方法来说,这个方法是不可被重写的。方法不能被重写就定死了,我这方法这辈子到老也就这个长相,你不能重写,你不要去扩展我,我不需要。Final如果修饰类,这个类是叫断子绝孙类,没有子类。啊,这个final修饰的类,这个类也是到此为止,不需要子类去扩展它到此为止哪些类是final的。
03:04
String。Method的,Math那个类,Ma这类都是final的,就是相当于一些数学公式,不需要你再发明什么新的公式去重写以前这些公式,不需要什么SCO的,Coing的,人家这辈子都就这么个用法,你们现在。不需要再去扩展它了,就这一类都不能用final来修饰,用final来修饰的你就不能使用C啊,被代理类不能是final,而且。被代理的方法。也不能是烦恼。啊,也不能是静态,因为静态没有多态,静态没有多态啊,这都是基本点了,基本点那么目标对象的方法如果是final,这说明这个方法不可被重写,那还代理个鬼啊,就代理不了对吧?静态呢,没有多肽,所以就没有办法啊,没有办法。
04:02
不会执行目标对象额外的业务方法就不会了,就不能被代理啊,这是需要注意的点,然后再来看。那这个代码我就带你们熟悉熟悉代码就行,因为你添加了swing的依赖。所以呢,我们当前这个method。你要通过方法拦截,啥概念?这是一个副类里面有这个S这个方法啊,S这么一个方法,然后有一个自己具体的一个实现。那么。我我生成,我要动态的生成子类。动态的生成这个子类,那么子类要拦截什么?要拦截父类中你指定的这个方法。我要把这个方法拦截住,在下面去增强功能啊,所以呢,你看。我们实现的叫method intercept这个方法拦截的功能。在这。
05:00
是否它也有一个成员变量,然后也是proxy factory这个构造方法传进来。成员变量,不过它不再是接口的,而是object object是所有类的负类。那么我来问object跟接口的区别在哪里?就是这个地方,我上一个接口。和我上一个object有什么区别?如果这个地方上一个service和上一个object区别在哪?接口是抽象的,其实接口更灵活。为啥?因为你不可能传一个接口的对象来,你传进来的必是接口的实现类。这个能懂吧。我这地方放的是个接口,但你进来肯定是接口的实现类。那么如果你是object,那就麻烦了,任何类型都能传进来,当你去用的时候,你要判别,诶,这是什么类型,是student类型,如果是先判别,然后再类型还原。
06:04
转换student,如果是teacher,然后再转正teacher,所有的类型要经过判别以后转换才能打点调用他的,比如说sing的那个方法。你必须还原这个类型,才有对应的这个方法呀。能明白吗?所以object就完蛋了,所以我们JDK动态代理用的是接口,接口的话你给我拿个实现类,我直接接口打点调用那个thing是不是就够了。我直接这么着啊,更方便啊更方便。好,有个印象就行,这都是基本功啊。然后呢,你看哎,老一套成员变量,然后传参,然后这个里面干嘛了。同学们,这个object这个方法是我实现了这个接口的方法。这个接口中必备实现的方法是这个。那么在这个里面你会发现它的功能是啥?诶,是不是就是那个额外的功能再加的那个。
07:03
动态的调用。目标方法的那个功能,然后再结账走人,好像是扩充功能加业务功能加扩充功能的整体实现。能看懂吗?那么这个其实就是我们在JDK动态代理里面invocation。我可以说汉德里面干的就这个事儿。就这个事儿,但是有没有发现他是不是一个。返回了一个对象,返回了一个动态代理的对象。他是不是返回动态代理的对象,No,他并不是,他只是增强了代理的功能,这个地方只是增强功能。并没有返回对象来,返回对象在哪呢?再往下看。这个地方生成代理对象,这个才是那个get,就是我的get agent那个方法。才是那个生成代理对象的方法。记住这个类in。
08:04
啊,我给你们上到账啊,记住这个类型汉。完成啊,子类。代理对象的创建,这个才是此类代理对象的创建啊enhancer啊,那么enhr怎么用呢?再来看啊,我拿到enhancer这个工具以后,设置负类。他的super class就是我的那个目标对象点,不就是他吗?啊,我的父类,这是将来生成是子类啊,子类的父类就是当前本类啊,子类的回调函数call back this,调用当前实现功能,其实就调用这。这就是不好理解的地方,这个回调函数其实就是再用这个啊,一旦被执行以后就要用这个,然后这个就拿返回的是。
09:04
子类的代理对象,这en打点create,他才返回的是子类代理对象,就这一句话。前面的那些啊,前面的那些。然后一直到这个这个才返回的是此类代理的对象,得这么干啊,得这么干,说白了。那么这个是我们去实现子类代理对象。你的cg lab的子类代理对象,你得这么干啊,你得这么干,这个是返回的,这个就是子类。返回的是子类代理对象啊,子类代理就就这么着返回,所以这个写起来比较麻烦,因为它set back设置了一个回调函数,又添加了的依赖啊,所以就这么多,就这么多套路。只是你第一次见你觉得不太懂啊,其实你看看这个套路都几乎很像同学吗?
10:03
成员变量设计为接口,然后构造方法,传参传object进来,然后在这做代理功能的增强,在这去生成代理对象。大差不差的就这么连上,这就是cg lab真正的实现。
我来说两句