00:00
行,今天呢,我们就来讲这个本这个我们这个Java基础课的最后一章啊,最后一章的话呢,是叫JAVA90和11的新特性啊,这个讲励之前的话我们先复习一下啊,今天的话我们就不考试了啊,这个首先呢打开我们的E大瑞。来做一个复习啊,那前一天的话呢,我们是讲到了反射当中的一个叫动态代理啊,这儿呢,我写成叫反射的应用四啊,确实也是一个应用场景啊,这呢,尤其是我们到后边讲spring的时候呢,大家会接触到啊,动态代理包括a op变向器面编程,那么在我们这个基础阶段的话呢,大家暂且就把我们这里的动态代理哎,当成是反射的一个应用,通过这个动态代理呢,去体会一下反射的动态性就可以了啊,那么我们前一天重点讲的还是扎VA8的新特性啊,这个内容呢,其实也不少啊,讲上这个有一整天的这样的时间啊呃,那么我们先按照这个顺序呢复习一下啊,首先呢,我们来看这个动态代理,动态代代理动态代理这个跟我们之前讲这个面向对象讲到下的时候呢,接口当中提过一个叫哎代理模式,其实是一个啊,代理模式就包括了我们现在所要讲的动态代理啊,只不过呢,代理模式我们之前讲的时候。
01:18
说的是一个静态代理啊,现在呢,我们是一个动态代理,那如何实现这种所谓的动态,这就得需要用到反射。啊,其实又映射,我们一开始讲到这个反射,它呢说是动态语言的关键。啊,Java呢,其实算是个静态的啊,编译完以后,这个数据不就都确定下来了吗?啊但是呢,我们通过反射呢,可以让它呢,诶相当于体现一下这个叫动态性啊,加上引号这种动态性啊好,那我们这块呢,看一下这个这个动态代理啊,首先呢,打开咱们关于这个。哎,这一章的情况啊。繁殖机制。反正呢,最核心的还是大家掌握前面我们讲到的说如何呢,获取大的class的实例啊,然后呢,来创建运行实例的对象,调用运行实类的指定结构,这个呢,仍然是咱们前面讲到的重点啊,也是我们这一章的重点,那代理模式,呃,这点叫动态代理,首先呢,我们先关注一下什么叫代理模式,这其实算是一个复习了。
02:19
啊,就是这里边儿的这样的一段话啊,CTRLC啊直接呢,我们拿过来就可以了。嗯,把这个字呢,稍微调的大一点啊,14说使用一个代理对象。嗯,使用个代理对象,将对象包装起来,嗯,这个使用一个代理啊,使用个代理啊,将对象包装起来,代理呢,就是我们所说的代理类的对象,哎,将对象包装起来,这个对象指的是谁啊?对,就是被代类的对象啊呃,然后呢,对该代理对象啊,然后呢,用该代理对象取代原始对象啊,这也指的是我们的啊被代理类的对象,对任何对啊被代理类对象的调用都需要通过代理啊,然后代理对象就决定了是否以及呢何时将方法这个调用转移到原始的这个被代理对象上。
03:11
说白了就是凡是对这个嗯,被代理对象的调用都是通过我们代理类的对象来完成的啊,这呢就叫做代理模式啊,那静态代理也好,动态代理也好,都是代理模式,那首先呢,我们先回顾一下之前讲的呢,叫做静态代理,那静态代理呢,我们这个之前讲接口时候举过例子,然后咱们这个前几天讲这个课的时候呢,也举过这个例子了,那这块呢,其实还可以有一个更简单的一个例子来说明,呃,大家回忆一下我们讲多线程的时候,哎,第二种方式,我们提到实现reable接口的方式。你想想我说它呀,其实就相当于是一个静态代码,理解一下哎,实现reable接口的这个方式,我们去创建多线程,哎,我说这啊,其实就相当于是个静态代理。
04:06
想一想为什么?你看一方面呢,咱们是不是自己定义这个class啊,比如我们叫my thread,哎让他呢去implements,哎咱们的randomable,哎这呢是A这个reable,这是一个接口了啊,这是一个另外的话呢,我们看这个底层源码,你会发现这个thread类本身它是不是也implements了。哎,咱们的这个re。啊,那就相当于我们这呢有两个类了,这两个类呢都实现这套接口了,诶已经呢满足我们代理模式这样的一个特点,然后接下来呢,我们在这个我就这个简写了啊,咱们在这个测试里边,这个没方法中,哎没方法当中呢,咱们呢是创建了一个my rightad一个对象。对,你造了个他的对象,然后呢,你这不又接着去new了一个thread吗?哎,New thread,你把这个T这不就扔进去了,哎,然后创建了一个thread类的对象。
05:08
哎,这样了,然后接下来呢,我们通过这个TH的这个类的对象调调的方法,虽然不是说接口中的方法,但是我们调这个方法的时候呢,说这个start,哎咱们看API的话呢,看到了说它有两个作用,第一个呢叫启动线程,同时诶调用是不是线程的run方法,哎调用现成的软方法,你这个线程不就是你的thad吗。就是你这个thread这个对象的run,但是TH这个对象run,我们发现真正执行的是不是就成了你这里的run。对吧,哎,所以这里边儿它呢,相当于谁呀。诶对被代理类吗。哎,它就相当于被带雷,而这个呢,就相当于是带雷雷。哎,这不有这样的特点吗?啊,我们通过这个呃,先创建一个被带类的对象,然后把被带类对象呢,作为这个参数放到我们带类的对象当中,构造器当中造一个带类的对象,哎,然后通过带雷雷的对象,我们调了这个方法的时候,这里边不就掉了它自己的RA了,你自己的RA呢,又调了我们这个被带雷对象里的RA。
06:16
哎,这呢就是一个典型的代理模式,哎,就是这样的一个事情啊,你看这样一说的话呢,跟前边我们来讲过这个知识呢,就联系起了啊,然后呢,我们提一下这里边静态代理它的一个缺点哈。哎,它的缺点想想主要有什么方面呢。那第一方面呢,就是我们这个代理类,对,就是大家提的写死了啊,代理类和被代类呢,在我们编写代码时候呢,就已经确定下来了啊,那你编译的时候呢,相当也是固定的啊,这是这个另外的话呢,我们程序当中如果你有比较多的这种啊,需要这个被代理的这个结构,你就针对于每一个被代类,是不是都得创建相应的代理类啊对,势必会导致我们导致我们这个程序当中啊,会有过多的这个代理类的对象啊出现,主要呢,就是说的这个两个方面啊。
07:03
嗯,这里边儿我们提到了第一个呢,就是代理类和目标对象,也就是被代理的对象都是在编译期间就确定下来,不利于程序的扩展。啊,这是第一个点。那第一个第二点呢,呃,每一个代理类只能服务,只能为一个接口,或者叫一套接口服务啊,这样一来呢,程序开发当中必然会产生过多的代理啊。是这个问题。哎,两个问题啊。好,这呢就是这两个这个点呢,大家理解一下就OK了啊,不用去死记硬背了,那么这呢就说清楚了,然后接下来呢,我们来提一下叫动态代理了啊,回到我们这个关于反射应用的这个场景上啊,这个我们通过反射呢去体现这种动态性啊,这呢我们就引入了叫动态代理,那动态代理当然它的优点的话呢,那就是能够解决静态代理的缺点,本来就是针对他的缺点说的动态代理嘛,是吧?哎,然后我们看动态代理的特点是什么。
08:09
啊,这里提到了说动态代理啊,是指客户通过代理类对代理类啊来调用其他对象的方法,其他对象就是被代理类对象啊,并且呢,是在程序运行的时候,根据需要动态创建的啊这个目标类的代理对象,哎目标类呢,仍然是我们被代理类,哎就是这样啊主要呢,在这里边儿你就体现就是说主要关注的就是这个动态这个词。这个15啊。行,哎,这里边儿主要体现了这个调用,在这个程序是在运行时根据需要动态创建的。哎,这个是非常关键的啊,不是呢,在我们编译器确定下来的,然后呢,也用不着说只为一套接口服务,因为呢,我就看你在运行的时候呢,你加载哪一个被带类对象,我呢就动态的帮你去创建相应的代理类的对象。
09:05
啊,这个话呢,有时候挺绕口的啊,还是能理解就可以,然后接下来关于动态代理的实现啊,下边我们就得看代码怎么写了。哎,说这个实现的话呀,就得需要考虑两个问题,哎,这两个问题呢,咱们在这个代码里边写了啊。哎,代码里边写了,哎代码的话呢,我们这块呢,得启动一下这个idea啊,这个idea的话呢,因为咱们今天诶需要讲的是JAVA9011啊它的新特性,尤其呢是十和11,咱们原来装的2017.3这个版本啊,就不支持这个十和11了啊,所以呢,我们这呢又升了一下级哈,生成2018.3.5了,哎这目前呢,算是比较稳定的一个版本啊,现在2019.1,呃说是也要出来了,但是可能还不是特别稳定,那这个呢,已经是包含了哎这个十和11了,哎,所以我们就用它了啊,诶我把它呢点击打开。
10:01
其实主要使用上的话呢,没有太大区别,主要呢,还是对新的JDK的知识,还有界面的一个变化是吧,嗯,对,看着更更艳丽了一些啊啊这种换成这种叫神秘子是吧。晚上的时候有时候喜欢看这种颜色是吧,好这个我们回来啊,回来以后呢,找一下哎,咱们说的这个代理模式,诶代理模式里边呢,是不是有两个问题,这是我们要解决的。好,第一个问题说呢,如何根据加载到内存中的被带类啊,动态的去创建个带类及其对象,哎,我得先想办法能够动态的去造一个被带类啊以态对象,其次的话呢,咱们目前能拿到的就是带类的对象,那拿着这个对象你去调一个方法,怎么就能让他去动态的去调用那个被带类的这个同名啊,当然也包括叫同参数了啊,这个方法A这是要解决的两个问题,那那针对于第一个问题啊,这呢,咱们下边呢,这不就开始实现了,它呢,主要体现的就是我们调了叫pro这个类的一个方法。
11:14
啊,New process instance是吧,就是我们调的是这个啊,那主要通过这个类的啊,这个方法来体现,我就在这儿呢,先暂时稍微简要的写一下啊。哎,通过。就是我们实际解决这问题的时候啊,诶。哎,通过它来实现啊。哎,通过它来实现或者解决这个问题,第二的话呢,我们这个当你通过代理类的对象。通过这个代理类的对象呢,调用方法A时,动态的去调用被代理类的同名方法A,哎,这个呢,主要我们是通过。
12:01
啊,提到了一个叫in vocation handler,诶这样的一个接口,主要呢,应该是这个接口及其呃,应该是接口的这个实现类了啊,哎,及其这个抽样及其方法啊。哎,这个方法呢,就叫做invoke,哎这样的方法,哎我们看到代码的话呢,就是呃,写到下边了啊,哎这个VO handler啊,以及呢,内部的一个引入和方法啊,它呢主要来体现的就是我们这个问题二的一个解决啊这样个事情啊,行这个颜色给它就变成统一的了,那具体的话呢,这个代码实现,哎大家呢,那你就看一下我们这里写的这个例子就行啊pro test这个咱们呢,现在就从头开始,哎这样一个实例啊,一直呢就到最后,哎这样啊CTC一下。那这个我就直接就粘一下了啊,这个代码呢,稍微变小一点。
13:00
好,就这样啊,哎,这里边俩问题呢,我们就删掉吧,这上面已经写过了啊,行这呢我们就来看一下这个代码的实现,这里边呢,当然也包括了,咱们后边又提这个叫a op啊面向切面编程里边呢,就这两个方法中间,哎我们发现动态的去调用我们某一个这个方法,诶在这啊动态调某个方法,这个呢,大家也理解一下就可以了啊主要呢,我们讲这个动态代理,大家呢,你就看成是一个针对于反射动态性的一个体验,呃,这个一个体现就可以了,那这个代码呢下来,呃,想写的话你就写一下这个,不想写的话呢,大概也能看懂我要说明什么问题就OK了,呃,就是想体现我们反射的一个动态性。啊,这个后边的话呢,比如我们学JDBC也好,学后边的这个,呃,Web阶段的相应的一些组件也好,包括后边的框架啊,你会发现呢,这个反射呢,应用的场景还是挺多的,但是呢,真正落地需要我们自己写的话呢,可能也比较有限。啊,主要的还是通过在框架里边呢,诶,它为了实现这种通用的操作,你只需要做一些配置,诶,它自动的就会通过你配置的这样一些类或者接口的一些路径,哎,你告诉我全类名,它就通过反射帮你去造对象方法呢,你写好这个重写的方法,它自动帮你去调啊,其实都是通过反射的方式。
14:15
啊,也就是说呢,后边你要想更好的去理解我们,诶做这些配置啊,用这个框架,用这个比如组件啊,这个为什么我们写完以后呢,它就自动能掉了呢,诶你知道里边它都是用的反射啊,就OK了啊懂反射的话呢,就更好的让你能够去理解这个框架的底层实现啊好,这是我们说的这个动态代理。
我来说两句