00:00
行,那前一天呢,咱们主要讲的呢,就是反射啊,呃,反射呢,我们说这一章呢,比较重要,同时呢也比较难,呃这里边呢,大家主要呢,呃,关注一下就落地涉及到这个代码具体应该怎么写,关于这个反射的理解呢,大家慢慢来,哎不用特别着急啊,就是先通过这个代码呢,你知道这个知识点怎么去用啊,然后呢,你再慢慢的通过这用的这个知识点你再考虑哦,为什么要这样用是吧,什么时候要用,这时候呢,其实对它就有一个更深的理解了啊,包括呢,就是咱们讲整个基础阶段,呃,因为呢,是整个咱们学习Java的一个初始阶段啊,很多这个知识点呢,大家可能感受的不是特别清楚,说哎呀,这个讲这个东西到底有什么用啊,这个呢,都是基于咱们后边比如说做一个项目啊,比如说咱们到外部阶段呢,也会做一个书城的项目啊,那到这个框架完了以后呢,那更得做了一个企业级的项目了,那一做项目呢,其实很多知识点你就都知道它是怎么去应用了啊,像这个集合也好,这个这包括这个反射也好啊,其实咱们讲一些知识点,我尽可能给大家说说,后边呢,在哪去用,怎么去用,哎,当然呢,毕竟没有讲。
01:00
是吧,你感觉还是稍微有点抽象哈,诶所以呢,这块呢,具体在基础阶段就是提到了哪些是重点的啊,那下来呢,一定要把这些东西掌握,那至于说具体怎么去用啊,一方面咱们也稍微说了说,诶你有大概的一个这个这个概念是吧,形象点这个东西,然后呢,真正到后边开发去用的时候呢,发现哦,原来是这样子,到时候呢,就直接应用起来就行啊,包括面试的时候呢,我们也讲到说这个呃一个呃讨巧的方式就是凡是提到任何面试中的问题,诶大家一定要回归到开发中,到底怎么去用的,就千万呢,不要为了答一个问题而答一个问题,把这个问题呢,真的就变成一道简答题了啊,很干的去说这个东西,这样就不好了,诶哪怕你说的这个点不全,但是呢,你指的呢,就是开发中的这个场景,诶这都是非常好的。啊,这都是非常好的啊,所以说呢,呃,就是基础阶段呢,对大家要求就是你把这个基础的基本需要掌握的知识点啊,一定要打牢是吧?关于呢,他的这些理解方面的东西,这个慢慢来,哎不用特别着急啊,到后边呢,你真正在项目中见到的时候呢,诶,你自然而然就有更深刻的一个理解了啊这个咱们一直强调的一种叫认知能力啊,这个认知能力呢,需要大家一点点去提升,哎简单来讲,这个认知能力呢,就比如说大家一开始咱们讲Java的时候呢,写了三五行代码啊,哪怕呢,第一天讲了个hard word你都觉得有点受不了了,就三行代码是吧?啊写了一个class,然后写了个main方法,写了个c out啊,那过了几天以后,我们讲的这个流程控制这个代码量呢,就稍微大一些了啊,讲了面向对象以后啊,那这是我们讲的这个项目三的时候啊,你看这一个类啊,就两三百行这个代码。
02:36
诶这个逻辑呢就更复杂了,等到后边这个项目阶段,那这代码量就更大了,诶相当于呢,通过这个代码量体现出来的就是这个逻辑呢就更复杂了,那你这个呃,随着你不断的去写代码,其实呢,你驾驭这种逻辑的能力呢,也就更强了,呃,其实呢,就相当于你的认知能力呢在提升啊,这个呢,其实是比较重要的啊,包括呢,以后可能到有一天,这个大家可能不想整Java了啊,又想整别的技术了,别的技术更火,或者说呢,这个Java呢,是不是看着有点没落了,举个例子啊啊,不要担心啊,就现在这时候呢,刚学完Java就呀,Java哪一天要黄了是吧?嗯,Java呢还是比较坚挺的啊,这个别语言不一定啊,就是呃,假设有一天你要学的新学新的技术了啊,应该说不会像大家今天这样一样啊,从零基础入门啊,吭哧吭哧一点了,定一个变量开始啊,写一个for循环,哎呀,分号也不能丢了是吧,哎,就用不着这样了,哎,你在学一个新的语言的时候呢,发现这个速度就非常快,就是因为呢,像Java呢,算一门应该算一门。
03:37
是比较重的语言啊,像它这里边的类库也比较多,语法呢也相对比较严格一些啊,你对它呢,有一个更深入的理解和学习以后,很多这个语言呢,它其实是相通的,语法上有点区别,但是它这个设计原理上很多都是相通的啊,所以说大家在学习新的语言呢,就会更容易一些啊,这就相当于你的认知能力,这个呢,其实是这个随着大家这个年龄不断的增长,技术呢不断的提升是吧,你这个呢是保留下来的啊,当然你这个经历的话呢,可能是有所下降的,但是你这种认知能力,你的这个解决问题的能力啊,你的这个业务能力,呃,这方面呢是不断提升的,也需要大家呢学习完以后呢,不断的去加强这方面的东西啊好,那我们来看一下今天这五道问题,首先第一道题啊,这里边涉及到一些代码,咱们CTRLC一下粘到咱们这个TT里边吧。
04:25
新建一个文本文件啊,Z11啊,CTRLV行粘过来一个一个来看啊,首先第一个呢,就是获取大的class实例的三种常见方式,哎,我这写的是三种常见的方式,咱们讲的时候讲了几种,对讲四种啊,就大家就别写那个class loader那种方式了,哎,就是前面这三种,它这个剧情的场景呢,你看还不太一样啊,嗯,最简单的一种啊,对,就直接点class这种方式,这我写一个CLASS1吧啊,咱们还以这个person为例哈,你要是个string呢,那就是string.class也行啊,这样OK,呃,这种方式比较简洁啊,直接呢就写出来了,但是这种方式呢,咱们讲啊,开发中其实用的不多哈,这种是用的最不多的,因为这种方式呢,为啥不多呀。
05:14
没有对象啊,没有对象,嗯,本身呢,我们拿到这个大的class呢,其实也用不着对象是吧,说这个大的class的一个实例对应的就是一个运行实例,这运行实例呢,诶,它是先加载到内存中就已经有这个大的class实例了,对象关于这个string的对象有没有,那那都是后框,后来才会考虑到对象的事啊,为啥他用的不多再解释。诶听到有同学说了啊,对,一个叫动态型,一个说叫写死了,这说的都对啊,就是我们反射啊,大家呢,学完这一章以后,一提到反射,或者你跟别人去讲反射的时候呢,一定要体现出它这种动态性啊呃,反射这个出现的一个主要目的就是为了要体现它的动态性,我们通过直接new的方式,可以扭一个string,我们可以扭个person,反射呢说也能这样做,那我为什么非得要用反射去做是吧,就是要体现它的这种动态性,对,包括咱们复习完以后呢,讲一个动态代理,再让大家去体会一下这种动态性啊,像这种呢,我们在编译时候呢,你就给写死了,就比如说呢,你像我这个死string,我写成个STRING1了,编译时候它就报错了,相当于在编译的时候呢,它就在它就在校验说是不是有这样一个类啊,就没有体现这种所谓的动态性啊,什么叫动态性呢?我们就是在运行的时候是吧,你需要哪个类的对象,或者你需要呢,加载哪个类,我才帮你去加载,就是在运行期做这个事儿。
06:41
不要再编译器就给它定死啊,所以说这种情况用的比较少啊,这个大家呢也知道,这也是一种方式啊,或者说呢,通过这种方式呢,你能更明确的看到大的class一个实例,原来对应的就是这个类本身,哎这个点呢体现的比较明显啊呃,那第二个方面,呃,第二个方式是不是就得通过对象了,对啊,比如咱们现在有一个person的对象,有了个对象我们直接去点是不是get class啊诶这个方式啊,哎这呢也会对应着一个大的class的实例,诶这个呢,其实也很好理解,嗯,这种方式呢,用的也也也比较多哈,就是在某些情况下呢,我们诶拿到个对象了,我得需要这个对象呢,看看它是哪个类给他造的对象,包括呢,大家这个应该有点印象啊,咱们在讲equal方法的时候。
07:37
当时讲E方法的时候呢,咱们一开始说自己写一个,后来说咱别自己写了,哎,直接用eclipse或者用idea自动生成是吧,自动生成的这个E方法里边,你看到是不是有这个get class方法调用啊对,他就想看看到底你这个对象是哪个类造的,咱俩要比ES,看看咱俩是不是同一个类造的呀,不是不是就别比了,是啊,是咱们再比一下属性是吧?哎,所以呢,会有这样方法的调用,那其实呢,就相当于是每个对象它都知道你是哪个类啊创建的。
08:10
哎,就是这样个意思啊啊,就好比什么呢,咱们呢,平时的时候呢,我捡起了去打印一个对象的时候。咱们通常说呢,打的是地质值是吧,其实在这个地址值前面呢,是不是关于你是哪个包下的。YYY点这这这下的什么某一个类是吧,然后是一个圈艾才是你后边这个地址值,对前面的话呢,其实就知道你是哪个类造的,哎,前边呢,就相当于是get class时得到的这个类啊行这呢是咱们说的这个第二种方式,第三种方式用的比较多一些。对,大的class的一个静态方法啊,For name,哎,这里边填的是string形的class的一个具体的路径是吧?哎,我们呢,通常叫做全列名,诶,叫做全列名的方式,哎,这个呢,我们再得到一个class。
09:07
哎三啊,这种方式是不是才能更好的去体现这种动态性反射的这个动态性,对吧,你像我们这个代码写完以后,我这个行三呢,写的是个字符串,编译的时候呢,他就光校验说你这是个字符串,哦是是好编译通过那运行的时候呢,我们才知道真正你放进那个字符串是什么,然后我帮你比如说诶造这个对应的这个class pass这个类的一个对象,这是在运行的时候呢才做的事。诶,所以说呢,它能更好的体现咱们说的动态性啊,咱们上课的时候呢,其实举了个例子,就是找了个随机数,还记得吧,哎,就是说的这个问题啊,一会咱们复习的时候呢,再提一下行这三种方式需要大家掌握啊,好过了第二个呢,说要谈谈你对大的class类的理解啊,这一章呢,呃,从这个这个这个难度上来讲,我们说相对比较难一些哈,一方面呢,就是这种动态性,呃,大家呢,需要呢去体会,当然了,目前还有限,毕竟咱们讲的代码还还比较少一些,大家到web阶段,到框架阶段,你一看这个底层源码你就知道,哇,原来都是反射是吧,就很清晰啊,就能更好的体现这种动态性。那么还有一个点的话呢,就关于这个大的class的一个理解。
10:30
啊,这个呢,需要能够说清楚那才可以,那找个同学试着描述一下啊,说这个大的class到底是什么,你不能上一整说这个是关键字class的一个大写是吧,这肯定是就没戏了啊。王贺,你说说。
11:02
带来的的一个。说的稍微慢一点,就是大的class也是一个类,然后边,然后呢是这个,然后对应这个类的。呃,这个有点问题啊,说大的class的一个实例对应着内存当中一个运行实类的实例啊,对这就对了啊,大家class呢,它它的一个实例对应着一个运行实类,那什么叫运行实类啊。是已经在手。加载到内存中的一个类,就是这个运营室类是吧?啊啊运势类的结构,比如说有哪些结构啊。嗯。嗯。
12:01
啊行就可以了啊,就可以了啊行啊请坐,就是通过这个大的class,就是刚才提到的一个点非常重要啊,就是大家呢,这个一定要说清楚,就是这个大的class它的一个实例,它就对应着啊,或者叫指向也行,指向呢加载到哎内存中的一个运行实类。哎,这呢,注意咱们这个类呢,后边咱们不也说这个知识点啊,不一定非得是类了啊,像数组啊,接口啊,是不是也都可以啊对,只是说咱们通常的话呢,都是一个类的这个概念啊呃,它呢就对应着加载到内程中的一个运行实类,是这个类本身充当了我们大的class的一个实例啊,这一定要明确,呃,刚才那会儿说的时候呢,口误就说呢,又对应的一个运行实类的对象,那就错了啊,这个它的它啊是这个这个生明这个变量类型,它对应的是这个类啊,也就说这个类本身又充当了另外一个类,也是我们大class类的一个对象了,行,然后呢,通过这个大的class这个实例啊,这个你可以叫class也行,哎,我们去调用相关的方法,那就意味着我们就可以调取对应的你这个运行实例的一些结构,咱们上课呢,也演示的获取它的完整结构,或者我们想调用某一个结构,那都是可以的,行,那这个呢,哎,就是理解的基础之上,大家去说就可以啊,不要去死硬背下边这个第三个问题说这。
13:23
创建大的class对应的运用实例的对象的通用方法,这儿呢,我写的这叫通用的方法,哎,让你代码实现,实际上这个代码的话呢,就非常简单了哈,诶你拿到这个对应的呃,运营实类这个对象以后是吧,哎不是运营实类的对象了,这个运营实类对应着我们这个大的class这个对象啊直接呢点一下。哎,New,诶instance啊这就可以了啊这样的话呢,我们就相当于啊,创建了一个咱们写成object类型吧,这呢就创建了哎对应的运行时类的对象,比如说你是个person类,这呢就是person类的对象了,行,那么这样操作呢,我们说要求运行十类,比如说person类,它的构造器方面满足的要求是什么呢?
14:14
第一个什么呀,对必须呢,要有空参的构造器啊,这一个是不是还不够,第二个对咱们要求呢,你这个构造器的权限也要够,其实倒没有说非得是public是吧,哎,就是原来呢,你比如说这是一个包,这是一个包啊,你要在这个包下用。这个包下啊,用这个类中的这个空单构造器,那你这个权限呢,就得稍微大一点了啊,你这是个public,你要在同一个包内的话呢,呃,Default也行是吧,默认权限的也可以哈。那注意默认权限,你这个default千万别写了,不要写啊,写default就错了,权限里边我们讲四种,其中有一种叫默认权限,但默认你别别给他翻译成default啊,就不要写就可以了,嗯,那通常情况下呢,我们说这个,诶构造器的这个权限修饰符啊,修饰符首先说呢,这个权限修符的这个权限哈,要够哎通常哎设置为这个public了,行,这就结束了啊,然后再下一个呢,诶我们提到过,在讲这个类的加载器的时候讲到了,说我们呢,这个在指定的目录下放一个配置文件,咱们在代码当中要去加载这个配置文件,这是咱们后续用的,呃,用的比较多的一种方式啊,那这种方式里边呢,我们提到了两种啊,第一种呢,就是用原来的直接,呃,这个proper呢,去加载一个流,哎,另外一种方式呢,就提到我们说的这个class loader啊,呃,这个我就不在这写了,一会咱们复习的时候呢,说一下就行。
15:51
哎,就是这种方式呢,大家也关注一下,实际上呢,你用哪哪哪一种都OK啊,哎,到开发中你用哪一种都行,那第五个,哎这第五个呢,是需要大家掌握的,咱们通过这个讲完反射以后呢,落地有几个代码上的体现啊,这个大家呢,需要下来这个写一写,诶这呢,我们是希望去调我们这个收方法啊,首先呢,咱们这个得到这个class,这个过程呢,就过滤过掉了啊呃,调用首先你得能够获取这个方法啊第一。
16:24
哎,Clear的method是吧,然后呢受方法,哎这个方法呢,我没有写这个擎参,所以直接就封起来,哎就可以了啊,哎,然后呢,是一个method,诶不妨就叫收吧,然后下一步呢,对这个别忘了啊,虽然说我们这个方法呢是一个public的,但是我们从这个通用性上来讲啊,尽可能大家都要加上这个叫set啊,Accessible,哎这个呢,我们改成是个触,哎保证呢它是可访问的啊,再接下来通过我们这个show呢,哎,你再去对调一个叫invoke,这个invoke呢之前你得先有一个我们大的class的一个实例是呃,这个对应的运营实例的一个对象啊,诶比如说通过这样的方式。
17:15
哎,前面呢,我们就造了一个对象,这个呢是一个user,哎,那你还得做一个强转,然后呢,把我们这个user呢,诶放进去,哎,它也没有这个参数了,这个呢,直接这样就完事啊,啊,它也没有返回值啊,这个也不用再去接收了,那这样的三步啊,第一步第二步第三步。行,这呢就是我们说的这个收方法啊,这个呢大家需要会写啊,这个调用一个属性呢,我没有考,呃,相对于来讲,这个调用方法的这个出现频率要更高一些,呃,方法呢出现频率更高一些啊,就比如说呢,后期大家涉及到数据库当中,我们横向呢是一条一条的记录,咱们在Java层面呢,我造了一个一个的对象啊,你这的一条记录就对应着我们Java中一个类的对象。
18:00
哎,我这呢有时调记录,我这呢就得造十个对象,哎这个造对象的时候,咱们呢,通常都会使用这个叫哎new instance这样的方式去造,那就意味着呢,咱们造出来这些对象的属性都是默认值。那么接下来的话呢,我们这个数据库中的这个表中啊,它这个都有具体的属性值了啊,这个说的稍微抽象一点啊,你就看我们这个通过我这个客户端呢,我连一下这个服务器,诶连完以后呢,这不是这么多张,这都是这个表,那我对应账号层面呢,我就造个类叫customer,哎,我造很多的customer这个类的对象,哎,就是空参构造器,然后呢,比如我们把这一条数据图片先不管啊,把这条数据中涉及到的这个值我都装到咱们的对象当中,涉及到它的ID name,邮箱,Birth birth,哎,Java中都有相应的类型呢,给大家去对应了啊,那这种候装配的时候。我们呢,其实可以去直接掉属性。
19:00
啊,还是通过反射的方式,你去调指定的某一个属性啊,这个属性从哪找呢?哎,你就从这个位置去找。比如你看这个叫ID,哎我呢就去JA号层面也找ID那个名的属性,哎类似的这个也一样,或者呢,你不操作属性,就即使那个属性是私有的,咱不说也能拿到是吧?哎或者你不操作属性,你调方法也行,你调那个赛方法,哎那就相当于我们去调的这种方式了啊调某一个属性,每一个属性的set方法也可以给我们造好的这个对象呢,去诶附上这个属性值行哎这样说的话呢,大家能够有一个印象就可以啊后边呢,咱们讲到这块的时候呢,诶大家知道是这样写的,哎,原理呢,我们已经说清楚了就可以了啊长这呢是咱们这五道问题。
我来说两句