00:00
好了,这个呢,就属于我们反射的一个应用啊,是一个重点,然后接着我们再往下看啊,如果通过反射呢,还能做什么事呢?说呢,我们可以呢去获取注解的一些信息了。那这个注解的话呢,咱们针对的还是这个person这个类,大家也会发现呢,我在相应的一些位置,比如说呢,当前这个person的前边啊,当前我们这个属性的前边啊,是吧?包括必要的一些方法的前面呢,我们都加上这样一些注解了,那我们通过反射呢,就可以去获取是吧?诶我们在前面呢,讲这个方法的时候呢,是不是也稍微的演示了一下,我们获取指定的这个不是指定了获取所有的这个注解了。哎,那我们在开发当中哈,其实呢,会涉及到呢,我们通过反射呢,来获取指定的一个注解信息了。啊,这个事儿的话呢,在咱们基础阶段呢,不是一个重点。那在哪是重点呢?在框架的时候是吧,诶包括呢,咱们讲这个annoation的时候呢,咱们也提到了,在基础阶段呢,这个注解也不是一个重解了,在框架里边呢,大量的使用注解了,既然你用注解了,哎,他用的注解框架里边都指定好了,你会用就行,你写上一个注解信息之后,其他的事儿不用你管。
01:07
呃,然后框架的话呢,自动的它会通过反射呢,去读这个注解信息。根据你写的这个注解的这个相关的这个属性值是什么,然后它就会做相应的一些处理,咱们需要做的事呢,你就熟悉一下常用的注解,知道这个属性的,哎,注解里边属性该怎么赋值就行了,其他事儿你不用管。哎,反射呢,能够去做这个事儿,咱们现在呢,就带着大家呢,稍微的感受一下,反射呢,大概怎么做的这个事儿。OK啊,所以这块呢,作为一个了解就行,哎,我这儿呢就把它放在这个other里了,体现呢就是它不是太重要啊,在基础阶段,我这儿呢有一个customer这样一个类。这个没问题是吧。好,然后这块呢,我们可以呢,做这样的一个情景啊,这个类了,我们在数据库的这个表里边啊。啊,有一个表,这个表呢,叫做customers是吧。哎,这张表了,好,我希望呢,说这个表呢,跟咱们这里边儿的这个类啊有个对应关系。
02:02
啊,那我们这里边儿呢,就指明说你跟谁去对应啊是吧,就是这个意思了啊好,那我们呢,就可以呢,去指定创建相关的这个注解了。我这儿呢,就来一个注解,比如说这个注解呢,我就叫做这个table了。啊,就要这个名啊,然后里边呢,我有一个哎死string类型的这样的一个具体的叫属性,我就叫做value吧。哎,这样写啊,诶这个写的话呢,大家可能说,哎呀,我都忘了这个朱杰怎么写了,当时咱们说过啊,你就参照一下。叫surprise warm是吧?Surprise warming,你就找这个surprise warming啊,进来以后它怎么写呢,我们就类似的怎么去写就可以了,你看它这边是这样去声明的里边呢,它这因为可以有多个值哈,所以它是一个数组,我们就一个值,所以我这人就把这个数组呢就给去掉了。啊,这个场景,然后另外的话呢,我们也提到过,是不是叫圆柱解啊。哎,所以这块呢,我把这个圆柱解的信息,我CTRLC一下,你也不用刻意的去记哈。
03:01
会CTRLC就行是吧,哎,然后粘过来,哎,我CTRLV往这一放。就拿过来了是吧,诶然后我们得改一改啊,别别搞定了,给改一改,诶我们这个table呢,这个注解啊,我只让它用来修饰一个类啊,接口啊这样的一些这个类型,所以呢,像这种属性啊,方法啊,参数啊这个就没必要了。我就去掉了。这个类型的话呢,就包括了我们说的,你看类啊接口啊是吧,包括我们后边讲的新特性record呀,枚举呀,你看都可以。它都涵盖了啊,所以我这儿呢,就只有个tap。另外的话呢,这个如果想让我们当前的注解呢,通过反射能够获取,不能用S。得用runtime是吧。好,这个呢,我们就写好了。哎,CR以后的话呢,咱们就可以呢,在当前customer我们在这个类的声明这块呢,咱们就可以使用咱这个table了吧。啊,为什么这块报错呢。因为没有给他赋值是吧。哎,那这块呢,其实是可以写一个所谓的默认值的啊,比如默认值我叫ABC,这你要写上了这块就不报错了。
04:04
是吧,但是呢,这个ABC呢,不一定适用于你是吧?哎,那你可以是不是显示的再给他指定个值啊。没问题啊好,假设呢,我们这个数据库里边这个表,你看我这块呢,叫customers叫这个名,哎,你可以在这个位置呢,你就写上叫customers。杨呢,就是诶我让这个类呢,跟咱们数据库中这个这个表它俩是对应关系。是吧,诶有这样的一个层次啊,诶或者这块呢,呃,咱们这块写可能大家不太好理解,我我我这样一写吧,我写个叫T下划线。是吧,假设你要创建表的时候呢,T就是table的意思了,你要这样起的名就知道了,诶它俩是关联的是吧。就行了啊。这个呢,你主要看这啊,这块要是啥这块你就用啥就行,我这呢只不过这样写,单从代码层面呢,大家更好理解一下,知道这是个表啊好,然后这个完了以后呢,我们针对这两个属性在表里边呢,是不是也有相应的这个呃字段呢,去对应是吧?哎,对应的是谁呀?哎,我们在这块呢,其实也可以再去指明一个。比如说我们就叫做啊,什么样的注解呢?叫column。
05:04
哎,就这么着是吧,这有个注解,然后呢,类似于咱们刚才的,嗯,咱们还是从这这块粘吧,CTRLC一下。好了,我们过来粘过来这儿呢,诶用它来去修饰咱们这个类里边这个属性嘛。那指明呢,你跟这个表里边哪个字段呢对应哈,再回过来这儿呢,我们有一些呢,就不用了呗。主要呢,就是属性是吧。所以指明呢,你就光现实属性就行了啊,其他的你要修饰呢,就报错这个呢,同样的是runtime。没问题啊好,针对这个,哎注解的话呢,我们说呢,也可以提供多个属性值,比如呢,我们提供一个string类型的,我叫呢哎叫column。Column就是列的意思啊,Column name吧。哎,这呢是一个属性值,我再来一个啊,死质类型的,我叫column type类型。啊,这个呢叫你这个列名,这个呢叫列的这个类型。
06:02
啊,写完了啊写完以后的话呢,它只能用来修饰这个字段,那么回过来我在这个name这块,我就可以呢去加上这个叫诶column这样的一个注解了,这呢报错是因为你里边属性没赋值啊,比如我们就开始来赋值了,这叫诶column的一个name啊这个name的话呢,你看论类型了。叫什么名呢?哎,比如我们在这个表里边儿哈,假设呢是叫cast name。哎,我就这样写了,然后逗号一下,还有一个呢,叫诶column们的一个tap在数据库里边呢,字符串类型呢,是叫work char类型。啊,就相当于咱们这个字符串啊,哎,但是呢,你还得指明一下这个长度是多少,比如我们是15个字符。诶,比如我们就这样来写的。啊,这就写完了啊行,然后类似的我们这个A的话呢,是不是也可以这样去设置吗。Column是吧,诶column的一个name啊,这个呢是一个叫,比如我们在这个表里边呢,加叫这个cost cost age,大家你会发现,诶怎么这样写,咱们在数据库里边呢,如果有字段,诶有点像这是一个单词,这是个单词,习惯性的话呢,是用下划线呢来分割。
07:08
咱们章里边呢,是不是习惯上这样去写。是吧,诶在这个数据库里边习惯上这样去写啊,这就是各自的一种规范啊。然后这个叫column整类。所以这块我也选中这个int类型了,诶你看这样呢,我们就写完了。写完以后的话呢,其实你现在这个注解啊,你只是加上了,其实也没什么用。要想体现你这个注解有意义呢,是不是我们得通过反射的去获取这个值,看你想干点什么事是吧?得这么着了哈,所以呢,我们这块呢,就涉及到关于这个,呃,注解的一个应用,咱们就使用反射了啊。哎,这个我就写成叫no。哎,他的一个测试吧,哎,就过来了啊好。哎,我就来写了,那那要想获取这个注解,首先啊,咱们呢,先来获取一下这个类上面的这样个注解吧,那我们得首先能拿到这个类啊。
08:02
这块回过来,然我们在这呢,先写一下啊,叫获取类声明上的。呃,这个朱杰啊。好,那这块呢,首先我们这个大的class。诶右边呢,是这个customer啊DR class,我就这样的简单起见啊,我就直接呢通过这种方式来获取了,获取完以后,诶我们通过这个诶class这呢就是这个类了啊它呢是不是就get叫declared notation了。没问题是吧,好,这个参数部分呢,是不是就你得告诉我你想获取。哪一个解吧。咱们是不是这个注解叫table啊。Table呢,咱们前面讲过了,说这个大的class呢,是不是可以指向很多种类型?嗯,我写到这儿了是吧。是不是也可以指向这个注解吧?哎,能这样这个注解好回过来我这块呢,写是不是就是table.class。哎,就行了啊,我就获取叫这个名的这个注解啊,Alt加个回车。这样呢,我们就得到了一个注解,实际上咱们清晰的知道这个注解呢,就是table。
09:04
所以呢,我就可以做一个强转。啊,这是没问题的,好,那我都拿到这个注解了,那这个呢,咱们不是有一个属性就叫Y6吧。啊,我这边其实对应的这算是一个方法吧,啊就调它啊直接呢,咱们打印一下就行。来咱们刚才这块对应的值。嗯,在这是吧,这个值呢,是不是叫T下线customers。嗯,那回过来。走起。这不就获取到了吗?哎,所以呢,以后我们在框架里边呢,大家呢,像这种逻辑呢,你不用去管了,框架呢,给你都写好了,诶你只需要呢,干什么事儿呢?诶在你像这个类里边呢,你看一下它,诶框架给我们提供哪些注解,然后呢,相应的这个值呢,都有哪些值可以去设置,你就在必要位置,你加上就行了。这个注解呢,框架写好了,你写上以后呢,获取这个注解的信息,框架也写好了。你只需要呢,哎,会放就行,会用就可以了。
10:02
OK啊,那类似于我们下边这个逻辑呢,也是可以实现的啊,这呢,为了方便起见,我就这样给他盯一下了,回到咱们刚才这个测试位置啊。这个我们叫哎获取哎,这叫属性,哎声明的这个哎注解信息。好了啊,来个二啊。哎,首先呢,我们得到你对应的这个类,这里有是吧,哎,然后呢,我们得得到你叫这个名的这个属性吧,然后呢,拿这个属性才能拿出解的是吧?啊通过这个class.get declared。看不见了。哎,Declared这个method不是method field是吧。叫这个name这个属性。啊,他这个有异常是吧,先让它泡一下啊。这个就直接整一个大的吧。Out加个回车,哎,这呢,我们就得到叫name的这样的一个field了。哎,这样是吧,好,我就拿到这个属性了,然后呢,接着的话,我们就获取这个属性声明上的注解。
11:07
哎,拿着它点儿。能猜到这个方法吗?Get declared是不是a not啊?哎,叫什么名呢?是不是叫那个名。Column第二,Class。好,这块我们就得到一个column吧。哎,咱们就叫一个,哎,Call叫name的一个。哎,就是name这个字段了哈,它的这样column这样的一个注解呗。嗯,这就可以了啊好,那么得到它以后的话呢,我们下边要做的事呢,不就是获取它里边这个所谓的属性的值吧。好,拿着它CTRLC一下,哎,直接我就打印了啊,第一个呢,我们叫get。嗯,Column没出来。Name column,这个column的话呢,我看一下啊。哎,是他是吧。嗯,这个没问题。Column第二没出来啊。
12:02
哎,出来了是吧,第一个呢叫column name啊,这是一个了,然后我们再复制一份。哎,第二,哎,Column的一个type。那这就可以了啊,那对对,我们这个name这个字段呢,一个叫class name一个呢叫work,来我们走一下。你看这时候我们不就获取到了吗。然后接着的话呢,反射呢,诶拿到你填写的这个所谓的这个属性值之后呢,诶你这个属性值写的也是有意义的,他呢接着拿这个数据呢,再去做相关的这个操作,那具体就看你这个注解这个字段呢是什么意思了,所以呢,他在看要干什么啊,这个呢,就相当于我演示一下这个框架底层,它是怎么用这个反射,怎么去用这个注解的,哎,所以框架呢,其实就是这样的一个公式。OK啊。那应该是有点儿感觉是吧。啊,体会一下就行,这个代码大家下来就不用写了啊。行,那整个的话呢,就算是咱们把这个反射的这种应用啊,咱们就都讲了讲。啊,那反正这块呢,其实还涉及到一种设计模式哈,叫动态代理,这个咱们就不在基础阶段去讲了,这个动态代理呢,通常会发现呢,写完之后大家也都不理解啊,等以后讲到框架的时候呢,再专门去讲这个代理会更合适一些啊好,那么关于反射呢,就这么几个事儿,重点大家要掌握的啊,第一个呢,关注一下。
13:18
啊,第一个呢,其实我们也替换成啊,这里边儿的第三种方式了,所以重点的话呢,其实就奔过来直接看这个三。啊,大家呢,把这段代码呢,多敲一敲。那关于呢,我们说的反射的应用呢,咱们就告一段落了啊这儿呢,也是咱们这一章呢,主要呢想给大家讲的这个点,那我们在一开始呢,提到这个反射的时候呢,就提到了,呃,两个事儿,第一个呢,我们指出呢,它在这个底层框架当中用的是比较多的,然后第二呢,就是主要呢用的时候呢,就体现反射的这种叫动态性。那么这个动态性呢,咱们一开始的时候呢,讲其实呢是说不清楚的,那我们这个内容呢,主体呢,都已经讲完了,那么这时候呢,咱们其实呢,就可以给大家举一个例子,哎,通过这个例子呢,大家呃来去体会一下反射的这种动态性。
14:00
OK,那咱们这块呢,就来写这个代码了啊,这个代码的话呢,比如说咱们就拿呢,一开始啊,咱们举例的时候呢,用的这个person类啊,以他呢为例呢,我们去说明一下,那我这儿呢,比如说把这个person类呢CTRLC,为了方便起见呢,我就粘到咱们对应的这样的一个包下了。OK就放到这儿了啊,然后呢,这块呢,我开始来写具体这个代码来体现了咱们这个反射的这个动态性,这名字呢,我就还教程叫诶reflect了啊,关于它的一个具体的测试。啊,这块我们写一下啊,叫体会反射的动态性。说什么叫动态性,来大家你看我这块写了一个代码啊。比如说呢,现在呢,我们想创建一个类的对象,呃,以前的时候呢,我们要是不用反射呢,说创建个类的对象,你想造哪个类的对象啊呃,这个方法呢,我们叫要get instance。那就是这样个场景啊,然后呢,这个调离方法的时候呢,返回一个类的对象,这个类的话呢,假设呢,我们现在指明的就是person类了,那这是我们写的代码呢,就是return一个,哎,咱们比如说调了一个空间的构造器呢,就这样写的。
15:01
那么这个方法的话呢,我们其实呢,就可以理解成是一种静态的特征,就我们在这个编写的时候,包括运行的时候呢,就非常明确,咱们现在创建的这个对象是person类型的。啊,这个呢,就是体现一种叫静态性。啊,这个叫哎,代码的这种静态型啊,就是编写,哎,或者叫咱们直接说叫编译也行啊编译呢和运行这块我们都是非常明确它对应的这个类型啊,诶就是一个person好,那下边的话呢,我们再来看一看,怎么呢,去体会这个啊反射的这种动态性。诶这个动态性啊好,那比如说现在呢,我们仍然呢,是想创建某一个类的对象啊,当然这个类呢,是哪个类呢,我这儿呢,也不想写成object,我就写成是一个具体的T了。啊,其实大家都应该也能知道,我现在想写一个是不是翻译方法了啊,那个T呢,是我们说不确定的某一个类型,它是一个参数,所以这块我们得加一个T是吧。我这儿呢,仍然叫get instance。
16:03
那就这么着,然后呢,你上面这个方法的话呢,诶,你就只能是我们也没传参数哈,就是返回那个person了,而我现在的话呢,通过这个参数确定你到底想创建的是哪一个类的对象,我就写一个死string类型的,比如叫class name。那我就这样处理的,那里边怎么做呢?那我们就通过那首先大的class点放内,诶我们把这个class name呢,哎就放到这了。哎,这么着是吧,然后他可能会抛异常,那我们就让他抛出去,这样呢,我们就得到了一个大的class的一个实例了。啊,没问题。好,那么这个实例呢,就指向了,注意我们这个class内呢,回头传值的时候呢,传一个权类名啊,那对应的我们这样一个运营实例了,我想创建的就是你这个类对应的一个对象了,那这块我们怎么去做呢?调构造器了就是吧,调构造器的话呢,咱们说过呢,在JDK8的时候呢,我们可以用这个new,但是它呢是有一些要求的,所以我们推荐呢,是不是第二叫get declare是吧。然后这块呢,咱们也调了一个空餐的构造器,所以呢,里边就不用填这个具体的参数了,返回的话呢,就是一个constructor。
17:04
啊,比如我就叫他了。看没问题啊,相应呢,它也有异常,咱们就直接给他抛一个比较大的吧,好,那我们得到这个构造器了,那这个构造器的话呢,有可能它的这个。呃,这个权限修饰符呢,比较小,咱们也给他写一个吧,叫set set给它改成这个true,哎,保证了它是能访问的,然后接着呢,拿着它我们去调这个它自己的叫new instant,这个方法咱们调的还是空的构造器啊,所以这也不用写了,直接呢把这个呢,我们做个return。啊,这是因为它默认反馈的是一个类型了,我们在这个位置上只需要做一个强转就可以了。你看哈,这呢,就是咱们讲到的关于反射的相关的应用啊,这儿呢是获取大达class的实例,这个呢就是获取指定的构造器,然后呢,呃,通过这个构造器呢,返回相应的这个类的一个对象了,那我说呢,这个方法就具备通用性了,或者叫体现了,这个叫动态性。你要单独光看这个代码,你是不是完全不知道他创建的是哪一个类的对象了?对啊,那这个代码一旦写好以后,那你根据用户传进来的字符串的不同,我创建的类的对象呢,自然而然的也就不同了,下边呢,就是咱们具体的一个测试了,那你比如说我们这个上面这个静态的,咱们只能是调get。
18:12
啊,这个方法的话呢,它返回的就是一个person的对象,你想改那不好意思,你也改不了。啊,这才是我们说这个静态的一个情况啊,那对于我们这个静动态的这个情况呢,我们呢,去调这个get这个方法,呃,需要呢,传一个啊类的权利名,比如说呢,我就class name。咱们呢,就以刚才说的这个person为例,把它打开,诶这块选中以后呢右键,诶这呢我们copy一下它的权利名的这个路径啊粘过来,然后就放到这儿了,然后呢,把这个呢CTRLC往那一扔。诶,此时呢,当然它有异常啊,咱们也跟着就抛一下,它就能够返回一个啊,你看我们在这个啊,直接在这写吧,诶我们person类型的,我叫P21。OK,那就可以了。啊,那这时候我们就能够创建一个person类的对象啊,你上面这个类似是吧,那个叫P。
19:00
这叫AP21是吧,这块我们打印的话呢,呃,其实呢,都是能够创建对象的。啊都没问题啊,只不过呢,你上面这个就是一个静态的,我这儿呢,就体现了一个动态性,诶这个方法的话呢,你可以呢,传其他的这样的这个类型是吧,你比如说这块呢,我们传一个传一个他吧,比如说Java点浪包下的,浪波下的,U下的。有个date是吧,然后这时候呢,我们这是它的这个class name,然后把这个传进去,返回的话呢,就是一个date的一个对象了。诶,我叫DATA1啊,这个呢,我们指明呢,就还是这个U下的。把这个CTRLC啊往这一放,那这时候呢,我们就能创建这个date的一个对象。啊,没问题啊,所以这时候呢,就体现了我们这个所谓的动态性。啊,看这个代码,完全看不出来你创建的是谁的对象。好,这呢我们体验是一个造对象的一个过程哈,我们呢还可以呢,再给大家呢,去举个例子啊,体会啊反射的这个动态性,这呢叫举例一啊。
20:00
啊,这个叫举例,然后呢,我们下边呢,还可以呢,去考虑一下关于方法的一个调用啊,诶这个我们完整的再把它粘过来。啊,这个我们写个呢,比如叫这个举例二是吧,好这个呢,我们定一个方法啊这个方法的话呢,它的返回值呢,目前我就先写成叫object吧,啊这个方法呢,假设呢,也就叫做这个叫O了。诶,我想调用啊,这呢还写成一个叫class name,我调用这个类当中的指定名的这个方法,诶实质类型的叫method。哎,Name。诶,我就这样写的了。啊,这儿呢,就相当于通过方法这块呢,也能够体现我们这个所谓的一个动态性,OK啊,诶那么这块呢,你像这个方法通常哈,咱们从以后呢,开发的角度来看,一般呢,都是非静态的了,所以这里边要做的事儿呢,也得先要创建对应的这个权威名啊,对应的这个运营实力的一个对象了,所以这块这个逻辑呢,跟我们前面写的这块呢,是基本上一致的啊。一直到这吧,先啊,CTRLC。这个我粘过来啊,里边呢,第一步呢,就是先创建啊这个全类名。
21:06
啊,对应的运行时类的啊这个对象啊,这个呢,就咱们刚才做的这个事儿了啊这个位置的话呢,咱们就直接啊返回的,我就写成是个object吧。哎,先这么着结束一下啊好,这个异常的话呢,咱们也先给他都抛出去啊,抛一个比较大的了。那这呢是我们的这个第一步啊,然后第二步的话呢,我们现在呢叫诶获取运行时类中的指定的方法。哎,制定了一个方法,然后呢并调用啊,我就写一起了啊好,通过咱们这个点,我就get declared method这个名这个方法。啊,这个方法的话呢,我就也不传这个对应的这个参数了啊呃,这个呢,传参数的这个事儿呢,其实我们也可以呢,嗯,这个其实还有其他的更复杂的这个逻辑是吧,吸烟呢,参数呢,可能就像我们说的这个注解一样,拿到这个注解的这个属性的这个值,拿到的也可能是一些配置文件啊,拿到那个参数的值。
22:00
啊,暂且我就先不考虑这个事儿了啊,咱们就先调一个这种空参的这种方法,好拿到这个方法没有参数接收一下。哎,我们就是一个method。那就可以了啊,然后这个方法的话呢,通常啊,诶一般呢,我们既然掉它了,它的权限呢,一般其实都是public了,但是万一它要不是呢,所以呢,Set sale,那我们也可以改成个true,然后接着这个method的点,我们调它的这个引某个方法,把咱们上边这个就这个加L了,然后我们这个对象呢,这不就放进来嘛,你也没有参数,那这样就可以了,然后这个方法调用完以后呢,它的这个返回值作为我们这个方法的返回值,那我们就直接呢return一下就可以了。诶,这个我就写完了,写完以后呢,下边来咱们同样的做一个测试啊。好,比如说呢,我们现在呢,想调一下这个person类当中的,咱目前都是空餐的了啊,反正我就调这个售方法嘛。哎,就以它为例来说,行,那么回过来,诶,首先啊,实质类型的一个class name啊,跟咱们上面这个person呢,这个路径是一样的啊。哎,CTRLC一下。
23:02
嗯,这样呢,我们就粘过来了啊,然后再来一个string类型的,比如我们这个叫a method的一个name啊,这个咱们叫一个事嘛。哎,这样好,那我就去调,咱们刚才写的这个叫这个方法,把这个class name呢放进去,把这个me name呢放进去就调用了。啊,这个异常呢,我们抛一下。OK,行,然后这个方法的话呢,如果你要不关心它的返回值,接收的话呢,你就不用接收了,你要愿意接收呢,有的话呢,你接收一下也行。啊,Return一个value。OK啊这呢,我们比如说打印一下好了,写完了啊,写完以后的话呢,我们直接呢做一个run。好,大家你看啊,嗯,然后呢,这个呢,是因为咱们上面造对象了啊。所以这块呢,它执行了,它主要呢,我们看这个事儿,这呢,就是咱们这个事务方法的执行的一个情况。就掉了,然后这呢,是因为它的访问值是个word了,所以我们这块呢,再去接收的时候呢,它这块打印来对应的,这就是个no啊,核心的话呢,主要大家看这个位置啊,我们传进来的呢,你只需要告诉我一个名,我就知道呢,调这个类当中的这个方法了,而他们这个信息。
24:08
哎,我现在来演示的时候呢,咱们是写到这个代码里了,大家可能说说我这不一看,我也知道你掉的是这个类的这个方法。而我们实际在开发的时候呢,这个数据和这个数据。可能我们会放在。配置文件中。还可能是从浏览器当中发送过来的。啊,发送过来的话呢,你发的是谁,我呢,就创建你发送过来的那个相应的类的对象。这个呢,就是我们在后边开发当中经常见的这种场景。什么情况,什么意思啊,这个意思啊,我就简单的说一下,比如说啊,咱们也都提到过了,说呢我们后边呢,会讲比如这个汤CAD这个服务器了,咱把写的Java的一个项目呢,就写在啊,部署在我们的汤凯的服务器里了,好假设呢,我们现在就写一个非常简单的一个呃程序吧,这个程序呢,就是比如说是个书城啊,或者个电商啊都可以啊。
25:00
呃,然后呢,我们最起码呢,是有用户的一个登录啊注册呀,是吧,或者用户呢这块呢,他想查看某一个,诶做一个搜索行为是吧?诶包括呢,他想这个提交这个订单,诶查看购物车等等啊,他有好多这种行为,其实呢这些呢都体现为是请求。诶,就是用户呢,他点击相应的这个视图,他就会有相应的这种请求发生啊,那么你看刚才我提到了说有登录的,他可能有注册的,还有其他的,那这个请求的话呢,其实是非常多的上千个都很正常是吧。好,那假如呢,我们现在有100个请求吧。不同的请求啊,那他假设呢,想登录,但是你想我是不是后台这块呢,得有相关的某一个类里边呢,对应的一个方法,是不是专门来处理用户的这个登录的这个请求啊。哎,就是相当于用户呢,一想登录我这块呢,把数据呢,就发送到你后台的这个类的里边了,然后呢,这个方法呢,注意都是非静态的方法,第二一呢,就是这个方法也想调是不是得造这个类的对象啊。
26:00
假如咱们叫A类吧,啊,然后这个方法的话呢,诶你就得调这个方法里边干什么,咱们很清楚,就是获取用户的用户名和密码,然后接着呢,咱们再去,诶后边会讲像JDBC这个技术是吧,最底层的这个技术了啊,我们去在数据库里边查一下,看看这个用户名密码,你看在不在,如果要在的话呢,你返回给这块呢,假设就是个处了,你再反馈给用户,你说响应一下说登录成功。是吧,如果呢,这块呢,写的不对的话呢,没查着这个呢,就是个false了,这块你告诉用户说呢,用户名啊不存在,或者密码呢不正确啊用户呢再重写。总之的话呢,我们在这个后台这块呢,得有这个位置呢,去写这个逻辑,那现在的这个注册也是同样的道理,那就是注册的一个类,然后注册对应的方法,然后还有这么多的请求,是不是有好多的类啊。好,那我问大家哈,你说我们这个应用呢,写完以后,咱们刚才也提到了啊,用户发的这些请求后台呢,得有相应的对象,是不是来去调对应的方法是吧,那么问哈,你说这些对象一开始在用户调之前,这些对象存在吗?
27:05
不存在是吧,因为你想这些对象如果要存在的话呢,这服务器是不是得累死了。那得提供多大的内存,天天给你先放这个对象,而且呢,你还有可能不掉是吧。是吧,那这个就很尴尬了啊,那这块呢,我们说明呢,就是这个对象呢,肯定不会先给你创建好,创建好你要始终不掉,生命周期特别长,这不也算一种泄露吗。哎,那么我们怎么办呢?是不是当你请求这个。呃,这个你比如说你是登录啊,你有登录的请求的时候,我再把你对应的这个类的对象是不是才创建了。诶,那注册呀等等的,其他也类似的道理,好,那么这时候呢,你发送了一个叫登录,举个例子啊,发送登录的时候呢,它携带了一个标签,这个标签呢,假设呢,就叫做log in。我们怎么办呢?对于他来讲呢,他首先呢,去获取一些用户的这个标签,我拿到这个标以后呢,我就知道哟,你想登录是吧,好,我就呢让它呢,是不是映射A这个类啊。我一看你想登录,诶我呢,就通过后台呢,我就动态的是不是创建一个A类的对象。
28:06
我只要知道你的权利名就行了。这个完了以后呢,你这个方法呢,其实咱们都固定的哈,就知道是哪一个方法了,我就调你叫那个名的那个方法了吗。哎,那你要这块传的不是一个login啊是。啊,我就知道你想注册了,好,我就拿着你这个标签呢,我就知道了,诶让它呢映射到你这个B这个类上,我呢就通过反射的动态的创建你这个B的对象,然后调你这个指定这个名的方法。你看刚才我说的这个过程,诶,只需要呢,知道这个标签是什么,我们通过这个权利名,方案名,我就能造这个对象调这方法,诶不就类似于我们刚才举的这样一个场景吗。所以呢,我们这个啊,你看我现在举例呢,是写死到代码里了,硬编码了,但实际情况呢,这个信息呢,咱们呢,可以通过配置文件。可以通过用户呢,发送这个请求,我们呢去体现这个不同,然后后边这个相关的调用的这个代码呢,提前框架都已经给我们写好了。
29:00
啊,咱们直接呢回去调用就可以了啊,这儿呢,实际上是给大家举了一个呃例子啊,综合这个例子呢,大家主要呢,就是体会一下这个反射的这种动态性,那就可以了啊,这个代码大家写也行,不写也可以啊。好,那这个呢,完事以后啊,其实呢,咱们关于这个反射这块呢,主要内容啊,就算是结束了,最后这块呢,我放了一个练习,这个练习呢,我觉得还挺好的啊,通过这个练习呢,大家呢,再来稍微体会一下这个所谓的这种动态性,诶我们看这个题目呢,怎么写,实际上呢不难好吧,我们有一些知识点呢,都融合在一起了啊。来看一下,说这个案例呢,是叫榨汁机呢,榨这个水果汁儿,这个水果呢是一个接口。呃,叫做福这样的接口了,然后它里边呢,是有这样的这个抽样方法了。然后呢,对应的话呢,我们有这样的几个实现类啊,苹果香蕉橘子,那相应呢,你要实现这个接口的话呢,就把这个方法呢给实现一下就行了,是吧,然后这呢是一个榨汁机。这怎么念?R,是吧?这个呢,是榨汁的这个方法,这个还把这个音标放这儿了哈。
30:04
Quiz是吧,Space啊这样。然后呢,这个榨汁机里边有个方法,这个方法呢,就诶形态呢,就放了一个fruit fruit了。那肯定呢,我们在调这个方法的时候呢,这是接口没有实例,是不是一定是多肽的方式呢,传这些对象啊。好,那这块呢,传的是哪个对象啊,这块我们说呢,诶不是写死的硬编码了,而是呢,动态的去获取的,这个从哪去获取啊,咱们这呢,提供了一个配置文件啊,你想扎什么针,在这个配置文件里边呢写清楚。哎,所以这个题呢,其实挺好的啊,大家呢,可以下来写一写来,那咱们这块呢,就按照这个顺序呢先来吧,首先呢是fruit这样的一个接口。OK啊,新建一个接口是吧,叫fruit啊回车一下,然后对应的这个出方法这个都写了。啊,Squeeze这个呢,就是榨汁的一个方法啊。哎,像这个单子呢,本身你也不太熟,那你最好呢,在这儿写明一下啊。炸。这儿这儿加个儿吧,啊哎,这个方法啊。
31:02
啊,这个呢,就是这个北方人说话好像爱戴这个。爱恋儿化音是吧。榨汁儿,北京人更爱说是吧?嗯。好,这个呢,就是我们说的这样的一个方法,然后呢,它有几个具体的实现类啊,就这几个,先把这几个呢先提供一下。啊,来一个Apple。哎,让他呢,Implement一下咱们这个,哎,Fruit是吧,好CTRL挨一下,哎把这个方法呢,我们做一个实现啊。说那叫哎炸。砸砸呢?汁是榨一杯,比如说这个苹果汁儿。苹果。直耳是吧,行啊,这是它了哈,然后香蕉还有这个橘子啊,嗯,这个我就把这个CTRLC一下吧。
32:02
来一个banana。一下这个叫fruit啊,诶这么着来。哎,这个呢,叫香蕉汁。想想你儿子。香蕉,OK啊,好橘子。Orange。你看这个苹果的话呢,现在苹果手机,一说苹果手机呢,就感觉挺高大上的,你说要有个手机再出了个叫香蕉,你就觉得有点low似的是吧。还是先入为主了是吧。嗯,橘子。嗯,加一杯啊橘子汁啊,哎,这个还没写呢是吧,Fruit行,这个就比较简单啊。然后啊过来我们呢,提供一个类啊,这叫竹丝是吧。叫榨汁机。OK啊,这个榨汁机里边呢,主要是写了一个方法。就这个。在这个方法里面呢,调这个啊fruit呢,它的这样的一个squeeze这样的一个榨汁的方法。
33:04
回过来站到这儿啊,这呢直接用F呢去调我们刚才的。这个方法就可以了,行这呢都相对来说比较简单一些啊。然后呢,诶这块提到了,在SC下建立一个配置文件啊,叫这个名啊CTRLCSC下啊右键新建一个file啊粘过来诶可以了,在这里边怎么写呢?所呢配置文件呢,是这样写的,说fruit name等于右边呢就写你具体一个水果了,但是注意呢,要写全类名啊,CTRLC。这块整过来,然后等号是吧,然后比如我们想炸个苹果汁啊,你就这块呢,双击选中这苹果啊,这样呢,Copy一下啊回过来V粘过来就可以了。好,这个就写清楚了啊,写清楚以后呢,下边就具体这个测试了。哎,CTRLC来我们这个练习这块呢,新建一个这个测试类,诶转过来是吧,这个呢,我们写个单元测试方法。那就可以了啊。
34:00
诶,然后呢,下边这块呢,就具体的说说,读取配置文件,获取水果类名,运用反射呢,创建水果的对象,然后调用我们这个榨汁机这个对象的这个软这个方法。啊,其实呢,这里边儿涉及到相关的这个代码,呃,对应的这个逻辑啊,咱们都已经讲过了都啊,诶现在我们要做的事儿啊,大方向来讲,第一个需求。诶,我们呢,需要呢,去读取配置文件中的信息是吧。哎,欣欣,咱们主要目的呢,是不是获取这个权利名啊。好,那么拿到这个全类名以后呢,我们是不是就可以通过反射呢,来创建这个全类名对应的这个类的对象是吧。哎,通过反射,哎,然后呢,我们创建啊指定。啊,全类名。这个对应的啊,这个类的一个实例了。好,那这个对象创建完以后呢,下一步咱们就是通过这个闸。汁机是吧,它的这个对象,然后呢,就调用刚才咱们写的那个软方法是吧,你把这个上面你创建的这个这个fruit fruit这个对象呢,你放进去不就可以了吗。
35:07
哎,这就我们大方向的这样的一个思路啊好,那首先来写第一步了,这个呢咱们已经讲过了啊,使用的呢叫a properties是吧。诶,你一个叫a properties这么着一个思路啊好,因为呢这呢把它放在了src下了啊,咱们使用类加载器型。实际上呢,使用传统的这个file呢也行。啊是吧,你要传统的写的话呢。咱们也提到过了啊,它默认的是是当年的这个module了是吧。那学校那显示的指明是不是src下的。这样的一个文件了。你是用。另外一个啊,File input stream,然后呢,把我们这个file呢就进去啊,这样是可以的啊好这呢有异常呢,暂且我就全部都选择这个了啊,诶我就直接整一个大的了。好,那有了这个流以后呢,我们就可以呢,通过这个叫点我们去load一下,把这个FS呢往这一扔就可以了。
36:05
哎,这呢,就我们讲的其中的一种方式啊,这个class的这种方式呢,大家也可以去写,我这呢就不用了啊好,然后呢,接下来我通过pro.get property。我们就找一下那配置文件啊,叫这个名改成C。诶放到这儿这样的话呢,我们就得到了一个啊死质类型的,你对应的里边这个值了啊,我就称为它叫fruit吧。这样呢,我们就得到这个权利名了。然后下边啊,通过这个全类名呢,我们去创建对应的类的这个实例了,诶,那class.for name啊,为什么说for name用的比较多呢,因为它呢更容易的去体现我们这种所谓的动态性啊。把这个字符串呢放进去,得到一个大的class的一个实例。就这么着啊行,然后得到它以后的话呢,我们接下来要创建它对应的这个全列名这个类的对象了,诶这儿呢,我们最好也是用这个get declare constructor是吧。诶通过这儿呢,我们去强调一下哈,为什么说扎B呢,都要提供一个空餐的构造器呢,因为呢,这些类里边呢,因为我们可能是造他的,也可能造他也可能造他的,最好呢,写个通用的,那就大家都提供一个空餐的。
37:10
所以我们这块调的时候呢,就都调这个空餐的构造器,OK。所以这块我们就得到一个叫哎,Constructor。哎,加深我们就叫他了,好这块呢,咱们也提到了,说张斌里边呢,你这个权限呢,也得是public了,所以这块呢,我们其实可以呢,不去调这个set access,那以防万一嘛。可以调一下啊。接下来呢,我们通过它,咱们呢,就可以叫news了嘛。哎,就行,在咱们这道问题当中,咱其实知道呢,你传的呢,其实都是一个水果了,他这块呢,给我们反馈的其实是一个object类型的。是吧,一个对象了,但是咱们都知道呢,是水果了,所以我就直接呢,就声明成一个叫哎fruit了。这个呢,我就写成叫诶fruit了,所以这块呢,需要做一个强转嘛。没问题啊好,这个呢,水果我们就造好了,接下来啊,你需要呢,去捏一个你这个。哎,榨汁机是吧,诶榨汁机这个对象就有了,然后通过这个榨汁机的对象呢,我们去调这个run方法,你把这个fruit呢往里一扔,然后fruit这个run方法里边呢,去调它的这个啊榨汁这样一个方法了。
38:09
诶就完事啊好,你看我们这个代码里边呢,大家如果你要去看的话呢,其实你看不到任何它到底掉的是谁的打针的方法。诶,然后我们把这个事儿呢,其实呢,呃,通过这样一个配置文件的方式呢,实际上呢,是要创建它的对象了。行,那回到这个位置,咱们现在做一个执行。诶,你发现了这时候呢,它炸的就是一个苹果汁吗?啊,主要原因呢,就是我们配置文件这个位置了,你现在把它改了。哎,这个点儿来一个banana。啊,这时候炸的就成这个香蕉汁了。是吧,哎,这个换成orange就成了这个橘子了。OK,你看这个呢,就是我们后面呢,在诶框架当中是吧,使用的时候呢,这样的一种场景,诶其实这块呢,还体现一个好处呢,就我们代码呢,跟这个数据呢,是不是就实现了一个分离了啊,代码里边呢,是不是都体现了有这种动态的这种特性啊,大家体会体会这个例子呢,也不是特别难,所以大家下来以后呢,可以呢把这个题目呢写一写啊。
我来说两句