00:00
好呃,关于反射这一章呢,咱们最后呢,还有一个知识点,叫做反射的一个应用,叫做动态代理,呃,这个动态代理这个等一下咱们先来描述一下,然后呢,就开始在这个代码层面呢去体会一下,诶关于这个动态代理在咱们基础阶段讲的话呢,大家呢,就把它看作反射的一个应用,哎,通过这个动态代理,大家呢,再去体会一下我们讲的反射的动态性啊主要呢,我们讲这个目的呢,就是让大家去体会一下反射的一个动态性啊动态代理嘛,是吧?诶不做其他深入的要求,那么后边的话呢,大家学习框架,不管是咱们这个扎VA1的同学来讲,还是大数据的同学来讲,当然大数据呢,讲这个spring框架的时候呢,就要薄的很多了啊,诶,咱们张阿E的同学呢,讲的时间就会稍微长一点,在这个spring当中呢,有两大核心,第一个呢叫IOC容器,呃,第二个呢就叫做A,那么IOC容器的常见方式呢,就是呃,依赖注入,那么A的这个原理就是动态代理。
01:00
啊,到那个时候呢,我们会这个具体的来讲a op啊来去谈这个动态代理啊,那么到那时候再说啊,在咱们加va基础这个阶段,大家呢,把这个动态里就看成是我们反射的应用,大家就知道啊,这里边呢,确实体现反射的动态性了就可以了啊,不做深入的这个要求啊行,首先呢,我们来看一下关于这个代理模式的一个原理说呢,使用一个代理将对象呢包装起来,然后呢,该代理对象取代原始对象,任何对原始对象的调用都要通过代理啊,那么代理对象就决定了是否以及何时将方法调用转到原始对象上。咱们呢,前边也讲过静态代理了,通过静态代理你也可以去理解这个原理,因为静态代理也好,动态代理也好,它都是代理模式,只是说呢,我们这个代理到底你是编译时候就定下来的,还是说呢,在运行的时候呢,动态创建的区别就在这儿,它的原理是一样的。
02:01
诶,那刚才说这个事儿大家能理解不?有的同学呢,前面咱们讲接口的时候呢,说过这个代理模式都已经忘了差不多了。啊,这个回过去可以翻一翻啊,就是涉及到呢,以前讲过的那种望,其实很正常,这个你要正在正确看待这件事情啊,啊说过很多遍是吧,哎,但是呢,你这个哎遇到这个东西不会了,确实前面讲过的,记着往回翻啊,你别这个说啊,老师说了这是正常的,接着往下走也不看了,那不行哈,正常来讲你应该去看一下啊嗯,这个代理模式,咱们简单画一个小图哈,这呢是一个接口,或者叫一套接口,不一定是一个了,这呢是一个类,这呢是一个类都作为我们这个接口的,呃,应该是画虚线啊,这个实线关系都是这个虚线了,实现了我们这一套接口,那其中呢,有一个呢叫做代理类,有一个呢叫做被代理类,比如说你要租房子,那你呢,就属于被代类,那你租房子,你得有这种去找房子这样的一个功能,那这块呢,不是你去做的,你找了个中介,这中介呢,就是代理你去做这个事儿啊,你想打官司啊,你是属于这个这个被代类对象啊,你呢成为你的律师。
03:10
帮你做这个事儿,你是一个明星,你像唱歌,哎,然后呢,整个的前后都有好多这个事儿需要打理的,哎让代理类就是你的经纪人哎,帮你去打理这个事儿,哎代理类就是面上呢,都是他去,呃,这个中经经纪人是吧,都是他去做的这些操作,调的这个方法,但是在某些方法里边呢,他调的其实还是你还是这个被带类的对象啊,说白了就是我们想调用的是被带类的对象,调的是他的方法,但是呢,他的对象的创建,包括方法的执行,都是由我们代理类发起的,或者说呢,我们这里边对你这个被代理类的这些调用呢,进行封装,由代理类来决定是要不要创建你的对象,以及呢何时创建。啊,然后关于方法呢,何时调用都是在我们这个里边封装起来的,它呢就称作这个类的一个叫代理类啊,就这样子的,那特点呢,就是这个代理类和被代理类呢,它得实现同样的一套接口啊才可以,当然我们通过代理类的对象,比如说像这个,呃,说明星是吧,唱歌哎,比如有个方法就叫sing啊唱歌这个呢,在我们接口中定义了这样一个创方法,这两个类呢,都得需要去重写这个创方法,那么代理类的对象调这个姓方法的时候,里边呢,我们就封装了对被代理类这个明星的啊,同样的这个方法的名的一个方法的一个调用啊这呢就是说典型的代理模式啊代理模式行,那下边呢,我们再接着看说之前呢为大家讲解过的代理模式啊,属于静态代理,什么叫静态代理呢?特征是代理类和目标对象,也就是被代类的对象。
04:49
都是在编译期间就确定下来了,不利于程序的扩展,同时每一个代理类只能为一个接口服务,或者叫一套接口服务,这样一来呢,程序开发当中必然呢会产生过多的代理,那最好呢,可以通过一个代理类完成全部的代理功能,就是我们这儿呢,你是想买房子,呃,这样有一个接口,然后呢,相应的这个带类带类,现在你这块呢,又想干别的事了。
05:16
啊,这个又有这样一套啊,还有这个明星的这样,诶我发现呢,诶,每一套这样的一些代理类和被代类这个模式当中发现都得有这个代理类啊,那么在我们这个程序当中就会出现比较多的这个代类的一个创建,说呢不利于程,呃说这个产生过多的代理呢,不太好说,能不能什么呢。反正你代理类的这个作用啊,就一个,哎就是呢,负责对我们被代理类它的一些功能的一些这个相当于封装了啊,哎,你通过带雷类的对象,哎调方法的时候呢,实际上本质里边呢,都是调的被带类了,哎他们的功能呢,是相似或者叫相同的。那既然这样,我们就考虑能不能呢,写一个通用的代理类,哎,去完成这样的功能,但是这个所谓的通用的带类呢,你又不可能在编译期间就确定下来。
06:09
因为呢,编译期间确定下来,那你这块要实现这个接口,那这个呢,你就没法用了,所以怎么办呢?我们这时候呢,只能是在运行期间去看,比如说运行的时候,你加载的是这个背带类,诶那我就根据你这个背带类去帮你动态的创建一个代理类。啊,然后得到一个代理类的对象,就代理你的执行,那你如果在运行期间呢,加载的是这个类,对,那我就动态的帮你创建这个类所对应的一个代理类啊,以及造代理类的对象,那后边呢,也同样的道理,那言外之意呢,就是我们需要在运行期间去创建一个代理类,就根据你加载到内存当中的被代理类是谁。啊,这呢,这不就也体现了这种动态性嘛,你加在哪个类,我呢就创建你这个类啊对应的那个代理类。
07:01
那咱们又说过这个带雷类和被带类,它得实现同样的一套接口,所以我们在运行期间的时候呢,你加载的哪个类,我就看一下你这个类实现了哪些接口,我呢就也实现跟你一样的那些接口,诶这样不就形成这样的一个哎小三角这样的关系了。啊,这呢,就是我们动态代理这样的一个创建的想法,那要想在运行期间啊,去造这个类啊,这个这个这个这个这个提供这个类,然后造这个类的对象,所以我们就得通过反射才能做。哎,就是反射的一个应用叫动态代理,哎,刚才这样说应该大概有个感觉啊,啊,那么这个动态代理的使用场合啊,调调试啊,远程方法调用,这就涉及到我们后边在框架当中的一些应用场景了。这个到时候呢,我们再讲啊,那么动态代理相较于静态代理的优点啊,说抽象角色就这个接口声明的所有方法呀,都被转移到哎调用处理器的一个集中的方法中处理,这样呢,我们就可以更加灵活和统一的处理众多的方法,哎说白了就是你一个代理类就可以搞定,哎,其他的这个所有的背带类了啊叭,较灵活一些啊,哎,我们通过反射呢,不就是想写这种所谓的通用的一些功能嘛,这个通用体现的不就是灵活嘛,哎,就这个意思啊。
我来说两句