00:00
好,那么反射的话呢,咱们就讲到这儿了啊,然后呢,我们针对于反射这一章呢,做一个复习,哎,找到我们对应的啊这个复习。找到我们这个反射机制,OK,好,首先的话呢,我们回忆一下这一章呢,我们主要讲的几个问题啊,第一个的话呢,我们可以理解为呢,叫关于反射的一个概述。OK啊,这呢看作是我们的第一个问题啊,然后第二个问题的话呢,我们可以呢,看作是针对于class呢,我们进行讲解,诶class呢,我们称为呢叫反射的一个源头。诶,针对于这里边儿有些内容啊,还是比较重要的啊,需要大家呢去掌握的啊,然后这个完了以后呢,我们讲了一个需要大家去理解的说明呢,叫类的一个加载过程啊,加载过程里边的第一个阶段呢,叫做loading loading里边就涉及到叫类的加载器啊这两个内容啊,需要大家呢去做一个理解就可以了,不作为咱们基础阶段的重点出现。好,然后第四个的话呢,我们就涉及到这个反射的具体的应用了。这呢也是咱们,哎,这一章里边的讲讲的这个重点啊,第一个呢,就是我们可以呢,叫创建运行实类的对象。
01:05
OK,这是我们说的第一个这个啊应用场景,然后第二个呢。嗯,第二的话呢,我们说呢,可以获取运行室内的,哎,所有的结构是吧。哎,所有的这个结构啊,具体的话呢,我们一会儿呢展开再说啊,然后呢,这个完了以后接着反射的应用三,哎,这个呢,是需要我们重点关注的,那就是我们去调用指定的结构。啊,指定的属性方法构造器啊,这呢是我们一个比较重要的内容,然后接下来的话呢,还有一个叫反射的这个诶叫应用次了啊这些话呢,在我们这个基础阶段呢,就谈不上多重要了,但是在我们后期框架当中呢,这个呢是被频繁使用了,但是频繁使用呢,也不用我们自己特意去写了,咱们只需要呢去使用这个注解就行,然后框架呢,就把这个调用注解的事儿呢,就给做好了,这就关于这个诶叫注解的一个。使用的问题啊。这呢,就我们说的,呃,主要的这样的几个内容啊,然后最后呢,我们再去啊,就要体会一下叫关于反射的,这叫动态性。
02:08
OK啊,这呢就构成咱们整个这一章里边的几个内容啊,然后这一章的话呢,相对来说呢,我们觉得是比较抽象一些的啊,所以这块理解上的话呢,稍微的大家需要花点这个时间,当然你可以呢,把这个重点呢,不用放在这个理解上,而是放在我们主要对应的代码上,那现在代码呢,能够去写,那我觉得就可以了,理解呢可以慢慢来啊。好,那么关于这个反射的概述呢,这个呢,也是做一个熟悉就可以了。好,那这块呢,首先呢,就提到了。啊反射,那什么是反射呢?是吧,我们抛出这个问题,能不能用比较简洁的话呢,我们去概括一下反射它的一个作用是吧,就像我们说IO硫啊,多线程啊集合一样叭,较简洁的话呢,就概述呢,你可以这样来说啊说呢就相当于是诶Java给我们提供了。啊,这个或者叫一波或者叫一套都行,一套吧,啊A篇,然后呢,使用这套一篇。
03:03
哎,使用这条片说我们可以。哎,我们可以呢,哎在哎运行时是吧,就是执行的这个时候啊,哎动态的。哎,我们要获取啊,这个指定对象。哎,所属的类。啊,你可以理解成就我们通过这个对象呢,调这个get class这个方法啊,然后还可以呢,去创建啊这个运行时类的对象。啊,你可以理解成就我们这个相应的这个应用一啊。啊还可以呢,叫调用啊,指定的这个结构。啊,这个结构呢,就是指定的这个属性啊方法呀,是吧,等这样的一些结构啊。行,这呢就可以看到是我们反射的一个主要的一个介绍了,呃,实际呢,就在说它的这个应用OK啊好,这呢是我们说的这样一个场景,然后下边呢,就涉及到了这一波API呢,都有哪些呢。
04:00
哎,涉及到这个API呢,具体的对应的这个情况啊,这咱们课件里边呢都有写,诶主要的API呢,我们是在啊这个里边好CTRLC一下。好,这块呢,大家熟悉一下就行了啊,诶这不涉及到了,就是浪包下呢,是这个class啊,剩下的其他这些呢,基本上都是处在我们这个reflect这样一个子包下的。哎,子包下的这样一个场景了,啊好,这呢是我们说的这个叫诶反射的一个API了,然后再往下的话呢,诶我们把这个事呢就归结到这了,说呢原来咱们写代码,这不是也涉及到了,说你创建运营实的对象,以前呢说也能够,呃new对象调属性调方法,说现在通过反射呢也能做,那到底反射呢优点是什么?啊,缺点是什么是吧?哎,所以这呢,就是反射的优点和缺点,这个呢,大家也是了解着就行。然后这块呢,咱们课件打开就在这写着呢,之前咱们在讲到这个内容的时候呢,说这个优点咱们没有具体展开来说,因为毕竟呢,刚开始接触是吧,我们也很难说清楚,说这个优点,那现在呢,我们再来看呢,应该大家要更清晰一些啊。
05:01
好,我们稍微看一下,说这个优点得往前拽一下的啊。好,这个优点的话呢,先说缺点吧,如果缺点的话呢,说这个性能较低。啊,就是相较于我们原来的啊,直接呢去new调这个构造器,包括呢,我们通过对象调属性调方法,诶它这块的话呢,我们得绕一下是吧?哎,通过这样的相关的API的使用,我们才能够去调用相关的一些结构,所以它这个性能呢,相对来说呢,要低一些啊。然后另外的话呢,由于我们写的代码量呢,比原来我们正常的找对象找方法的代码量也会更多一些,所以有的时候呢,我们会感觉呢,会模糊我们程序内部这个逻辑可读性呢,相对来说要差一些。因为毕竟呢,它要体现这种动态性,不像咱们原来写的代码,哎,你像我们这里边儿呢,提到中最后这个动态性的时候。哎,在这个位置的时候是吧。在这儿哈,所以呢,我们非常清晰的,你一看这个方法就知道呢,它返回的是一个person类的对象,有的时候你看这个话呢,你都不知道他要干什么。呃,然后呢,这块调用方法的话呢,传了个东西啊,你还得结合着看,诶它这个要干什么,所以这个可读性呢,确实是要稍微的差一些的啊,这个呢,算作是它的一个缺点了,那优点是呢,提高了Java程序的灵活性和扩展性,诶主要这块说降低了耦合性,提高了自适应的能力。
06:14
啊,这个提高自行能力,你可以理解就是奖励耦合性这个事儿啊,诶你像咱们最后呢,举的这个练习的这个例子啊,也能够很清晰的说明这个问题,咱们把呢,哎,你要创建的这个对象呢,我都写到配置文件里了。啊,大大的降低了跟我们这个代码的一个耦合性啊。啊,那代码里边呢,就纯粹呢写你具体的逻辑了啊,而我们这个数据呢,是放在相应的配置文件里边,是不是耦合性呢,就大大的降低了啊,像咱们原来的这种写法。那这个相应的这个代码的耦合度呢,就极高啊,非常清晰的你看到了造什么对象,这就硬编码的方式了。好,回过来说呢,允许程序呢,创建和控制任意类的对象,无需呢提前应用编码目标类啊,刚才也提到这个问题了,这呢就关于我们说反射的一个优缺点啊,这个大家呢熟悉一下就行。好了,呃,然后呢,你要再说一个点的话呢,也就我们提到哈,说这个反射的话呢。
07:05
哎,咱们在讲这个例子的时候呢,也提到过了哈,反正呢,咱们其实平时开发呢,用的不多啊。开发中是吧,我们使用。哎,并不多。啊,那主要呢,我们说呢,是在框架的底层实现是吧。或者叫框架的底层使用。来使用啊,那就意味着如果我们要想看框架的底层源码,那这时候呢,我们就需要学习反射,另外的话,你需要呢,开发框架,那你也需要学习反射,主要呢,就是利用它的这个优点,OK啊。啊,这呢,我们做一个熟悉就行了啊下边的话呢,我们具体就提到了一个大的class呢,啊这块呢,对应的几个问题,第一个就是大的class它的一个理解问题,这个呢,大家还是需要呢去掌握的哈,虽然说呢,这里不涉及到代码了,那但是呢,你得清楚这个我们写到这儿了。啊,最开始的这样的有一段话是吧,诶CTRLC一下,哎,这里边儿呢,我们是拿这个类来说的哈。啊,因为呢,我们这个大的class指向呢,它不一定是个类了,它可能还是一个接口啊注解啊是吧,这样的一个结构啊。
08:06
行,这段话呢,大家不用死记硬背啊,基本上能够理解就可以了。啊,就可以了,行。啊,这个呢,我们完了以后呢,接下来需要大家去掌握这个点,就是获取大的class的几种方式。啊,实力的几种方式啊,这个呢,我们主要呢讲了四种方式,哎大家呢,重点需要掌握的就是咱们提到叫前三种这个方式啊,哎稍微的熟悉一下啊第一个呢,是我们这个呃类呢,是不是掉这个静态的这个属性是吧。这第一种,第二呢。哎,对象我们去调一个叫get。是吧,诶任意的一个对象都可以啊,因为这个方法呢,是定义在object里边的,然后第三种呢,其实我们使用比较多的。哎,这我写一个二,这个呢叫使用较多。或者叫使用最多啊。行,这呢,就是我们通过这个大的class呢,它呢就调用静态方法是吧。
09:01
哎,叫for name,哎这里边呢,你把当前这个类的一个全类名呢,哎,你写到这来。那这个呢,就我们说呢,用的比较多,因为这种方式呢,其实我们能够体现这种所谓的动态性啊,因为串你具体这个对应的类是哪个类啊,你这块看是看不出来的,而这个的话呢,你对象。这都知道是哪个对象了,那这个类呢,这也都能看得到,哎,所以这呢也算是这种啊,硬编码的方式了啊。好,这呢就是我们说的这样的一个方法,然后另外一个呢,我们所使用的类的加载器,这个大家做一个了解就行啊。哎,这个呢,就是使用啊class loader是吧,它呢的方法叫什么呢?叫load class啊。Class。行,这里边呢,你也是调用这样一个结构就行啊,CTRLC实际上呢,这两种方式呢,还稍微的有点区别,但是这个细节呢,咱就不说了啊,后边呢,我觉得是有一个企业真题,诶问这个题了,待会我们这块呢,稍微的提一下就行啊好,暂且的话呢,我们就说到这儿,诶重点呢就是前三种,这个完了以后呢,下边我们又提了问题,就是这个大的class呢,我们说呢,通常指向是个类了,但是呢,它指向可能不是一个类啊,那就是它呢,到底可以指向哪些结构啊。
10:11
诶指向哪些结构这个呢,基本上我们说呢,凡是Java中涉及到这个类型的,诶,都可以被我们这个大的class呢所指向了。哎,所以这块呢,简言之呢,就是所有的这个大娃类型啊,就我们说的这样一个场景,那这个呢,大家也需要呢,就清楚OK啊。行,稍微等待这样一下啊。好,那么关于这个大的class呢,我们说到这儿呢就可以了,然后在下边呢,提到了呃两个问题,这两个问题呢,其实也有一定的难度啊,但是大家呢,不用去深究,诶两个事儿,第一个呢叫类的一个加载过程,第二呢叫类的加载器,诶类的加载过程呢,我们在这个课件里边呢,其实是有提的啊,但是这块我建议大家呢,你就不用去深究了啊,这个作为一个了解就行。啊,所以拿过来这我就直接粘过来,不多说了啊叫类。在加载这个过程。好,这呢就是相应的过程一过程二过程三,过程二呢又分成了三个子环节啊,这个你稍微的看一看就行啊,然后呢,在这个过程一当中呢,提到了叫装载啊,叫loading,这个loading的时候呢,我们需要把这个物理磁盘上的一个磁器码文件把它加载到内存当中了,而且呢,都对应了一个大class的一个实例了,呃,这个呢环节说是由类的加载器来做的,这两个环节注意跟类的加载器呢没有关系啊。
11:23
好,那么下边就是这个类的加载器呢,到底有什么讲究吗?这呢我们就提了一下这个类的,诶加载器,诶关于它的一个基本的一个情况啊,这块呢,大家也是做一个了解就行,你看这呢,我们也说了是以GD8为版本,哎,咱们当时呢,测试的时候还特意呢调过这个版本啊,这个大家注意你要自己要测的话,也建议呢你调一版本。要要不的话呢,你看到我们这个class呢,它的这个子类呢,诶我们不是提到说有这两个是吧,诶你要看它的子类呢,可能就会有变化了。啊,这因为在G之后呢,这个加载器的整个这个结构呢,又重新做了一个整,但一般呢,我们在开发当中,包括笔试面试问的时候呢,通常问的都是八的这个场景。
12:02
OK啊,诶同学说,那既然笔试面上都问,那我这块还是了解吗?诶这个呢,以后在GM当中呢,才会具体的再去展开说这里边的细节问题啊这个呢,咱们基础阶段呢,就不展开来说了,所以呢,我们其实呢,基础阶段呢,呃,有很多内容都可以给它延伸出来的。啊,你包括呢,我们说的这个GM是吧,延伸出来很多数据结构啊,也可以延出来设计模式啊,也可以延伸出来,这呢,我们就不能说在这里边呢,讲太多的东西太重了啊。好,这里边的关于类的加载器呢,大方向你知道分两类,然后呢这呢就是整个Java的体系,这个呢,就是我们说的这个CC加加的这个啊,源码写的了啊,然后呢,这个核心API呢,用的是它加载的,然后我们自己写的呢,用的是这个迅雷加载器。哎,这个基本上把这个事儿清楚就行,至于说呢,如何自定义啊,这个在基础地上更不用管了是吧,所以这块呢,我们也就是熟悉一下就行啊CTRLC。这个就拿过来啊,这个就不多说了啊,这个就了解一下理解一下就行,诶下边呢,就提到说反射的应用一创建运行实例的对象啊,然后呢,之所以把它放在这儿呢,其实呢,我们这块还是主要以JDK8呢来说的这个事儿,因为呢在JD8当中我们使用了这样的一种方法了。
13:10
啊,这个是我们讲到的。哎,该讲这儿了是吧。这里边用了一个方法呢,叫new instance,那如果从这个G9开始的话呢,其实到时我们没必要呢,非得是放到开头了,因为这时候我们只能说调用指定的构造器了啊,其实相当于就跑到这儿来了啊,但是这个JD8里边呢,这种方式确实我们用的还是比较多。之所以这块呢被depated了,还是因为呢,很多时候我们在设计这个类的时候啊,要么没空参了,要么呢通常有空仓,但权限呢又写的不够了,导致呢,我们这块调的时候呢,老出这个异常,所以干脆呢就别这样写了。啊,直接呢,你就直接调纸巾的构造器得了是吧,就这样的场景,所以呢,关于我们这个第一种场景,哎,这个事儿呢,我们也稍微的粘过来啊,大家呢,也了解一下啊。哎,这呢就可以了,哎核心的这个代码放在这儿了,那要想能够调离方法呢,诶我们说呢,也有相关的一些这个要求了。
14:01
啊,这个要求呢,咱们不是也写到对应的这个位置上。啊,这个就了解一下就行啊。那这个呢,我再写到这儿,嗯,行这就可以了,那这呢,其实我们创建运营实力的对象,这个需求呢是很重要的。你像我们要调这个指定的结构,通常呢,呃,以后边我们应用场景来看哈,调的这个结构呢,直接我们调属性基本上很少。嗯,就像我们直接呢,呃,有了对象以后,咱们调的时候呢,也通常都调方法了,你像我调属性呢,也都有盖赛方法,一般咱们也就调盖赛方法,所以调属性的机会呢就很少了,那调方法的话呢,方法基本上都是非静态的方法。啊,就是我们通过反射也好,或者我们不用反射也好,基本上咱们调的都是非静态的方法,那既然如此的话呢,就都得有对象了,所以这个需求呢,是应用反射呢,使用频率最高的。啊,这个主意,然后其次的话呢,我们说获取运营实力的所有的结构啊,这块我们是分成了两个,这叫什么level是吧,第一个呢,纯粹呢就是大家了解一下,第二个的话呢,稍微的大家呢熟悉一下啊这儿呢,我就不准备在这儿呢多说了啊。
15:06
熟悉是什么呢?诶首一下呢,我们可以呢,过去你当前这个运营室类,你的副类啊是吧,你实现的这个接口闷是吧,诶可能有多个嘛,你这个所在的包带发型的负类类的泛型哎等等。啊,这个呢,大家你看一看就愿意跑呢,就自己跑一下就行啊写的话呢,其实也不是特别难啊行这块呢就不是重点了,然后下边这个呢,是我们说的一个重点。啊,这个是一个重点,然后呢,上面这个呢是一个重点,OK,那么调用指定的属性方法构造器,诶OK,这呢,嗯,就是出于大家以后呢,你想看这个源码能看得懂的角度来考虑呢,你也得要清楚这个过程。啊,整个呢,就我们说这样的三个这个情况啊。哎,回过来我就直接呢,就粘过来了,这三个里边的话呢,显然最重要的呢,还是这个事儿。调方法,因为咱们用的频率就会不是咱们用了啊,这个框架体能用的频率肯定是最高的了,要造对象的话呢,可能就会选择这个了,就不用这个new instance了,属性的话呢,一般很少。
16:06
哎,通过这个反射呢,去掉了,包括我们平时开发也很少用啊,因为呢,你即使有这个属性,我们也通常提供盖赛方法还是调方法呢,去修改啊注意。好,这个呢就不多说了啊,大家要练的话呢,也是重点练我们这个部分啊,然后下边这个呢,就要注解这个使用这个呢,大家也是做一个熟悉就行啊,或者熟悉的了解一下就行,基础阶段的话呢,咱们也不需要大家去刻意的掌握,到框架的时候呢,大家也需要掌握的呢,就是具体的什么注解,哎,它的属性是怎么赋值的,诶每个值呢是什么意思,具体怎么调的,其实也不用刻意的你去关注了,但是你关注一下呢,可能。诶,说明你比别人了解的更多而已是吧,咱们这儿呢,也是举了一个例子,让大家感受一下怎么掉的啊。那这不就我们写的这样一个例子吗?在这儿呢是吧,来回忆一下啊,行,这个的话呢,我们就不过多的去说这个事儿了,然后下面呢,就要体会反射的一个动态性。啊,这个呢,从对反射的理解上来讲,最后我们相当于是首尾呼应了一下。
17:03
啊,这个反射的话呢,老说呢,我们在框架底层要用,为什么要用啊,也是基于它的优点,这呢,其实就简单来说,就是这种动态的特性。哎,咱们最后呢,也写了相关的这个代码呢,这个大家呢,可以下来呢,自己去写一写,哪怕你就当成一道普通的这个题目也行啊。哎,从有这个吧。诶从这呢到最后这个位置啊,CTRLC,我把这个代码呢,就咱们粘一下啊。OK啊行,这呢,就是关于我们反射的这一章的这个主要内容啊,如果理解上你觉得差点意思呢,还是写代码,代码能写了才是硬道理是吧。好,下边的话呢,我们看一看这个所谓的企业这个真题了啊。嗯,首先呢,说对反射了解吗?反射有什么好处,为什么需要反射?那其实主要呢,也是说反射的好处是什么是吧。咱们在上边这块呢,我也稍微提这个事了。啊对,就主要呢,体现的就是我们关于这个反射的这种动态性的一个使用啊,主要呢,使用场景呢,就在框架的这个底层去用啊,那这个呢,自己组织组织的语言就可以了啊,所以这块我就略了。
18:05
下边一个说反射的这个使用场合和作用啊,及其优缺点,其实上面我们也提这个事儿了,这俩问题呢,差不太多啊。说现在啊,下边说实现Java反射的类有什么啊,这呢就是问API呢是吧。啊,API的话呢,你就按照我们上边这块呢来说,最核心的API呢,就是咱们这里边儿提到的这几个。啊,就这几个啊,那除了这几个之外呢,你看还有哪些呢?比如咱们讲这个应用二的时候啊,嗯,咱们打开这个,比如说这个方法这块啊呃,像这个method的话呢,给我们来一个CTRLH吧。啊,这边就写出来,它在我们这个reflect包下了啊,诶除了它之外呢,你看包括我们这个an notation notation这个就。这个是吗?是吧?嗯,CTRLH。这在哪呢?Notation下是吧,这是咱们前面声明这个notation的时候嘛,是吧,哎,他不是了哈,然后呢,这个Mo fair,哎,CTRLH它呢,是不是也是啊。
19:04
哎,还包括呢,我们这里边儿提到了,我们获取它所在的这种啊,比如像这个tap是吧,诶CTRLH。是不是也在啊?Para raise type是不是也在?啊等等啊,包括我们上边,你看上边这个是不是啊,比如这个package。啊,Package不是了,是浪包下的是吧,OK啊,就是有好多这个结构呢,我们说呢,主要的不是浪包,那就是我们对应的这个这个子包啊就可以了。好,再回过来啊,那这个呢就不多说了,说反射呢,是怎么实现的。这句话呢,问的也挺。含糊是吧,诶这个呢,你要是打他的话呢,建议呢,就是从咱们这个大的class呢说起是吧。那有了它之后,它呢,对应一个运行时的类了,然后由它再展开,你再说一说,哎,我们都怎么用的就可以了。OK啊行,下边这个说大的class类的一个作用是什么?生成大的class对象的方法有哪些?诶,这个作用是什么呢。
20:02
这作用咋说呀?这个叫反射的一个源头是吧。诶,反射的的源头啊,诶其实呢,就相当于是比如我们相对来叫class啊ZZ的啊,然后这块指向呢,诶其实这块我们在堆空间里边呢,也会有这个大class,相当于还是个实例,但是它指向的呢,是我们在方法区上面,你要是一个堆空间的话啊,这一个方法区了,我们这块呢,就会加载各种各样的类啊,比如说你这个person类本身,或者string类本身啊,这个user类本身,那每一个这个类本身呢,就充当了我们这个大的class的一个实例了。诶,所以它这个主要作用呢,就是便于我们后期呢去使用反射嘛,所以它是反射的一个源头了啊,诶它的这个生成对象的方法在咱们上面不是讲了嘛,主要呢,你就说有三种是吧。那就可以了。行,然后接下来。说class for name全路径是会调用哪些方法,会调用类的构造,呃,构造方法吗?就是构造器啊,加载类会放在哪?
21:01
哎,这块的话呢,放在哪儿这个清楚,就方法区呗。哎,加载类我们说那叫放在这个方法区是吧,这个没啥毛病啊,然后他这块问说会调用构造器吗。这不就扩大器吗?会吗?会掉不?调用注意啊,他说会调用构造器吗?电扩大器你要干啥呀?你要找对象是吧,那我这块我要找对象吗。肯定不用啊,你只是加载这个类而已是吧,所以呢,肯定不会掉构造方法的啊。我要用这个,嗯,构造的一个方法,或者要构造器。哎,咱们老说构造器啊,平时呢,大家见到一些地方,可能它就叫构造方法,说的就是构造器前面这个啊,所以呢,它会调用哪些方法。诶这个话呢,可能就把有的同学给问懵了,是吧,会调用哪些方法,你这样想啊,我们这块呢,是不是要加载对应的全路径这个类了。那么类的加载过程当中,我们说会。
22:00
干点啥事呢?类的加载,我们是不是就返回到讲的这个位置了。类的加载过程呢,是不是会涉及到有这样的几个过程啊。那这几个过程你注意啊,第一个过程。第二个过程。都不涉及到代码的执行。啊,哪怕你说呢,这个prepare准备阶段呢,我们为这个static的这个变量呢,收复了一个默认值,这个呢,其实也不说有具体代码执行了,直接呢,你就是把它一加载这个值就是默认值。啊,这块呢,注意都不涉及到代码的执行,我们的这个初始化这个环节,是不是说会执行一个方法呀。诶,咱们也提了一下啊,叫CL1的这个方法,其实这块稍微说的有点深了哈,这个方法的话呢,它既然能执行,那这个呢,就是会初始化的时候会执行,那其实呢,就会提到了,说这个方法呢,它就会调用了,那这个方法里边主要是什么呢。就是咱们这个类变量,它的一个赋值操作,还有静态代码块里边的一个语句合成的是吧。那那如果说我们要是加载这个类的话呢,是不是就意味着我们这块代码就执行了呀。
23:05
哎,这个注意啊,这呢,就是我们想给大家呢,稍微提一下的这个事儿啊,那这个事儿的话呢,嗯,我写到一个位置吧。这个咱们写了一个other是吧,然后我在这个下面呢,比如我再新建一个具体的一个package吧。这个我们写一个,那叫。嗯,咱叫interview吧。Interview就是面试的意思了啊好,这个下边呢,我们稍微的提一下,前面呢,我记着我讲这个是order吧,你看我是不是写这个静态代码块了是吧,好,我把这个呢,我CTRLC一下啊。CTRLV我粘过来啊,我粘过来以后的话呢,为了证明这个静态代码块呢,它执行过啊,我这里面写一句话啊。Order的一个static的一个block是吧。哎,这不就是order类里边的static静态的代码块吗?这个我写完之后呢,你看啊,我现在来写一个测试。哎,Test是吧,哎这呢我写成个单元测试吧,OK啊好,那这呢,首先我们来一个哎,死针形的一个叫class name。
24:07
然后呢,这块找到order,双击选中右键,哎,这copy一下它的这个路径啊粘过来。啊,就它了啊。行,然后呢,通过我们这个class for name的方式,我把这个class呢给大家扔进去。哎,然后这块有异常,我们就抛一下啊。这呢,我们就得到一个大的拉的实例了,当然我诶声明成个变量,诶我也不用不用我就不声明了,诶就是这样的一个操作,注意看啊,我去run一下。啊,大家看。是不是这句话就执行了,哎,那就说明了我们这个for name这个方法的执行。调用是吧,它就会使得我们对应的这个类呢,是不是就加载完成了。哎,它的加载完成,哎,那就意味着它里边那个回过来,刚才我们提到的这样的一个方法,不就调用了吗?所以他会问说你会调用什么方法呢?我们说要会执行类的构造器方法是吧。哎,在这儿啊,说这个哎克拉。
25:03
第二它呢会执行。哎,这个类的叫构造器方法,哎,这就可以了。这个。清楚是吧。啊,这个清楚啊,好正常,就我们说的这样一个问题,那如果说我这块你看我再复制一份哈。这块我们要再去执行的话呢,还会再出来一个刚才那个输出语句吗。不会了是吧,哎,这个呢,其实我们也都知道了啊,说这已经加载过了,这个呢,你只是又通过这个方法呢,再去调用一下已经加载过的这个类了是吧。所以呢,它就不会再执行了哈,好这呢,我们这个就注释一下吧,然后顺带着咱们稍微的提一下这个事儿吧,你看我来个这个TEST2哈。诶,我那还把它拿过来是吧。哎,就搁这儿了哈,然后接下来的话呢,哎,咱们不是还有一种方法叫类ATE加载器吧。哎,我通过叫class loader是吧,还有一个呢,叫get system。这就获取到系统的加载器,对吧,然后呢,我去load一个class,咱把这个class name呢,是不是也能放进去啊。
26:01
肺有异常的,咱们也抛一下。这么着啊,然后这块加载完以后呢,对应的也是个class的一个实例,我也不用,所以我就懒得呢,去拿一个变量来接收了啊,那这时候我们去执行一下。大家看。啥也没做是吧。是这意思吧,诶就这块我一说呢,稍微有点多了啊,这个呢,其实是GM当中的一道面试题,他问什么呢?他问你这个class.phone name和我们这个使用类的加载器,诶去加载一个类的区别是什么?区别就在于这个操作的话呢,根本就没有执行我们的上面的初始化。那咱们刚才不是在这块呢,有这个操作嘛,是吧?哎,然后呢,就是我们类的加载器的方式呢,没有执行初始化,现在这个类呢没有。没有执行这一步,它只是呢,相当于把它给装载过来,生成一个大的class。你后边在操作的时候,如果需要了,它才会初始化。哎,相当于呢,我们这种方式是不是延迟了这个初始化的一个时间是吧。而这个呢,一上来就完全的把这个类呢,就是三步都走完了。
27:03
这个大家了解一下就行啊。应该没有同学说说是因为我们刚才执行过这个了,这个没执行,所以说这个在执行已经加载过了。不能这么着吧,啊,这个咱们执行这是一个独立的一个进程了,是吧,然后这块你在执行的时候,跟刚才那块是已经早没关系了啊,哎,这个注意一下。好,这个呢,我就多说了一句啊行,嗯,这块我们再回过来啊。哎,往下走。嗯,看到哪了啊行,这个咱们就说完了,下边这个说这个类的加载,说类的加载流程,这咱就略了啊,这个其实我放在这儿呢,那你就看一下,不是咱们基础的重点啊,说到创业对象,说一下创建对象有几种方法。这个呢,我们把这个问题放在这儿了啊。大家回忆一下我们创建对象除了new。还有别的方法吗?诶这块呢,其实我们零零散散呢,也讲了一些了,是吧,我这儿呢,有个位置呢,直接有一个现成的,咱们就拿过来直接看啊。
28:01
嗯,应该是在这儿啊。你看这个叫创建对象的方式,哎,我呢就直接的把这个呢,给大家粘过来就行啊。稍微的我们看一看,其实好多咱们都讲过了啊,那new的方式最常见的,然后变形的话呢,就是调用指定类的静态方法。calendar.get incense。是吧,这个诶,Local date local time local daytime.no这不都是调静态方法吗?以后呢,我们还会见到这样的场景,就是我也跟大家提过这样的啊,叉叉叉,The builder或者factory叫静态方法,好,然后这个呢,这不就我们反射的事吗?下边的也是反着的事儿。啊,这个咱们都说过了,然后呢,前面我们讲这个object方法的时候呢,提过这个Chrome。他呢也是一种方式。那这里边儿呢,要再展开,又涉及到深拷贝浅拷贝,这个咱就不多说了啊,然后下边呢,反序列化,你想是不是也是一种方式。咱们讲对象流的时候。哎,你把这个文件,把这个对象呢,写到一个文件里了,这是我们叫序列化嘛,反序列化呢,你就把这个文件里边这个,呃,数据呢,是不是还原到内存中,作为一个对象出现了。
29:08
哎,这呢不就也是一种,呃,咱算是生成对象的一种方式了啊,叫反序列化,那这个呢,没接触过这个用的也比较少一些啊,所以呢,上面这些。啊,清楚好,那如何找到对象,实际类的。是不是就直接对象点我们叫get class就行。啊,这个注意就行啊,你比如说我这块呢,我写的是object OB街我了一个。哎,我这块,哎你了一个date啊,这不有个日历的一个对象嘛,然后这块呢,我要这obg点,我叫get class,你说我获取到的是object呀,还是date呀。谁呀?对,获取到的是date啊。哎,是这个date。OK啊,就相当于呢,我们去实际上获取的说你这个对象到底是哪个类造的,你哎,那就是date这个类造的。
30:00
所以这块呢,要注意一下啊。诶,把碳扔到这里边了。好,下面这个哈说呢,Java反射创建对象的效率高,还是new的方式创建效率高。牛的方式是吧。所以平时咱们开发中呢,大家还是用这种方式多啊。下边呢,如果如何利用反射机制来访问一个类的方法。哎,咱们上面不专门讲的那个应用三就是这个事儿是吧,所以这块咱们就略了啊。下边一个啊,说一下Java反射获取私有的属性,如何改变值。哎,咱们上面是不是也讲了。这意思吧?我看这块儿大家可能清楚吧。清楚啊,这不就我们讲的这个结构三这吗?哎,这个方法这块我就先先这么着吧。把这两个CTRLC一下是吧。回过来啊,然后呢,关于方法这块呢。诶,不就是刚才我们说的里边的这个呗。这个我们把它包起来啊,然后呢,调属性这个事儿呢,不就是上面这个吗。
31:00
哎,就这个结构了啊,我把这个序号呢就去了。这就完事了是吧?啊这个完了以后呢,注意还有点儿其他的东西哈,什么东西呢,你看按照我们目前的讲解说,Java反射机制呢,获取私有的属性能获取是吧,然后我们通过set access呢,是不是也能够去。让它可访问是吧,然后接着你要改变值能就set啊,你要想获取值能就get就行,但是这个事儿的话呢,诶我们得稍微的注意一下哈,就是这个事儿的话呢,其实咱们在这个针对于JDK的源码的时候呢,会有点问题。啊,那这个问题呢,既然咱们说到这儿了,还是阿里巴巴的是吧,咱稍微的就给大家呢,把这个level呢往上提一提是吧。啊,这块我就开始写到这儿了,啊这个什么意思呢?哎,我再稍微的写个代码。嗯,针对于谁呀,针对于咱们说string吧,关于他的一个测试。类似的话呢,其实还挺多的类啊,我只是拿string来说,这个咱们都知道这个string name呢,它声明了一个私有的一个结构,我现在主要就看私有结构的一个调用啊,我就写一个string。
32:04
过来。嗯,17,咱们现在用的是17是吧,我就拿它来看吧。点进来啊,然后我们这儿呢,你看。从这个JDK9开始,它就改成这个叫bit数组了,那这块呢,你看它是一个私有的哈,它这是一个final了,那肯定就不能改这个值了,那咱们就不改了,咱就想看能不能掉吧。是吧,能调也行,好回过来啊呃,注意我们现在想调的是这里边的这个属性啊,回过来你看这块怎么写呢。啊,咱们使用这个方式吧,放内Java点。浪包下的string是吧,好这块呢,有这个异常,我们给他抛一下,得到一个大的class的一个实例。人没毛病啊,下一步的话呢,你注意我们现在想获取这个属性,它是一个非静态的啊,是不是得找对象啊。所以呢,我们通过这个诶class点嗯,这个string的话呢,它还真有一个空间的构造器。咱们看一眼啊好,CTRL呢F12STRING这个那权限也够,这会儿就省点事了啊,咱就直接的点叫new instance这个没毛病吧。
33:07
啊,其实呢,在这些时期里边也能用啊。好,这呢,不是咱们要说的重点。异常抛出去。这个呢,挺多的哈,直接整一个得了。哎,这么着啊好这块呢,我们奥特回车呢做一个强转行,我这呢已经创建好了这个对象了,形成OB接吧,那体验这个对象下边的话呢,我们想去获取,咱们说呢叫Y6属性,然后呢并。获取其值是这样一个情况啊,首先呢,我们获取外力这个属性,通过这个class.get declared。属性是吧,叫Y6。哎,这人没毛病是吧,好,Alt加个回车得到这个属性呢,叫Y6的一个field吧。然后呢,接下来我们这个叫,然后呢,去get一下对应的叫OBG这个对象,它的这个值是多少,是不是打印一下嘛。
34:05
这个咱们提到过这个逻辑了,行,嗯,注意哈,我现在的话呢,是在这个JDK时期当中了。哎,我先换成JDK8。就是八嘛,好,我OK一下了,然后把这个呢,我们去run一下。大家看是不是没问题啊,因为这时候我们拿到的,你看这块是这样的一个声明的,因为八里边不就是差行速度了吧。所以这块你看就写个C。没问题是吧。那这不就是这样的一个地址吗?现在呢,我把它改成叫JDK17啊。这DK17就在这儿嘛,这语法呢,咱们也让他适配这个17的,这时候我们再来。嗯,大家看这时候呢,是不是就报错了。啊,说不能够去访问,那这样个情况。啊,这个呢,什么原因造成的呢,就是我们这个GDK呢,在时期当中啊,有一个新特性,诶正好呢,咱们不是接下来要讲这个新特性了吗?把它呢先打开,我们先看一眼。
35:06
这个新特性呢,我们看就是这个17 17里边呢,它有一个这个。啊,叫强封装JDK的内部API。啊,也就是说呢,对于我们JDK的内部API,如果我加上私有的了。你就不要暴力反射了。OK吧,就是以前的时候呢,就是你想调私有的也能调,现在注意我是核心API了哈,你要是自己定义的API,就像咱们前面测试的,你私有的你该掉还掉,咱们这边在这个测试的时候呢,当然都说过这个私有的属性啥的都能掉,你自己写代码你想调也可以,但是呢,如果是核心一篇就不让掉了,使得我们JDK这个代码呢,就越来越安全啊。哎,这呢是一个GDK时期的新特性,然后呢,我在课件里边包括这个,呃,课后的有同学呢,做这个课后的这个练习了啊呃,有的时候你会发现呢,我调咱们核心API的核心API里边这个私有的结构了,注意呢,我要是写了,那是在GDK8当中。实习当中呢,就不行了,哎,注意一下这个小细节就行啊。好,这呢,我们在这儿稍微的我说一下这个事儿啊。
36:03
说针对于啊这个核心。啊,这个我们说啊,源码的。这个API说内部的这个私有的这个结构呢。啊,在JDK时期当中。啊,就不可以通过反射调用了啊。啊行,这个呢是一个新特性啊,这个大家稍微的关注一下就行好,那么这个咱们说完之后呢,诶,那这块你愿意把它这个描述一下呢,就也粘过来,这不就可以了吗。好,CTRLC一下。嗯,这样啊好,这样的话呢,不显得你说。这个懂得会更多嘛,是吧,如果说这块你就把这个咔咔一说,然后这面关一说说,嗯,我在后边这个版本当中发现就不行,你能理解吗。嗯,这个直接就说懵了是吧,哎,这呢就是一个新特性啊。好,这个复习呢,我们就说到这儿。
我来说两句