00:00
大家好,我是海波老师,接下来我们讲一讲Java语法中的反射啊,我们首先呢,先把程序文件先准备好,我们这里点击new,然后创建一个package啊,咱们叫CHAPTER10第十个章节了,然后呢,我们点击我们的右键,我们选择new,在创建一个class,咱们叫JAVA01,然后呢,我们的reflect,这个reflect呢就是反射的意思啊,然后我们点击class好了,然后呢,我们在这里写上一个men。然后呢,我们这里写上突突啊,咱们的反射写上。那么说实话呀,Java中反射的概念呢,是比较难的,那么这里的难啊,并不是说不好学的意思啊,而是从概念上不好理解。那么所以在讲概念之前呢,咱们先给大家问一个问题啊,屏幕前的你,你们觉得自己帅吗?你们觉得自己美吗?当然了,这种直击内心的问题啊,对于自信的你们来讲肯定是多余的,对吗?那对于男生来讲呢?那洗完澡以后啊,咱们头发不吹干的那一刻应该是最帅的吧?那如果对于女生来讲的话,咱们自拍的时候,我们稍微扬起下巴那个侧颜是不是你最美的时候呢?其实问题的答案与我来讲并不重要,因为我的答案和你们是一样的。这里呢,我只是想确定一件事情,就是当我们自认为帅或美之前,我们是不是都会先照一下镜子,或者找一张自为拍的不错,加了美颜的照片呢?那如果是的话,我希望大家可以发个弹幕告诉我一下。
01:20
那为什么会这样呢?其实大家想一想,如果你不照镜子或者不拍照片的话,你知道你自己长什么样子吗?如果连自己长什么样子都不知道,那你说我怎么判断我们自己是帅还是美呢?对不对?哎,你可能会疑惑呀,我怎么可能连自己长什么样都不知道呢?诶,但事实就是这样,我们就是通过类似于照镜子的这种方式来知道自己的样子的。如果大家认可我这个说法的话,那么告诉大家,我们Java语法学习中也存在类似的情况,那比如啊,我们在程序运行的过程中,我想要获取一个对象的属性或方法,我们该怎么办?那你会说了啊,这多简单呢,我们直接通过对象不就可以知道属性和方法了吗?对不对?诶,从语法的角度来讲,怎么做肯定是对的,来我们这里创建我们的一个类class。
02:07
我们叫做U,然后呢,我们里面添加一个方法,我们叫做TEST1,然后写个括号,我们里面啊写上一个打印。这个打印呢,我就写上TEST1就可以了。好了,力准备好了,那么我们这里呢,我们创建一个对象叫做U的。然后呢,等于new啊,咱们这里写上一个U的,好,接下来u.TEST1,诶这样的话呢,我访问一个对象的方法不就OK了吗?我点击右键。执行以后你会发现我们的控制台打印TEST1,你看没有任何问题,对不对?但是你要记住啊,Java语法中是有多态概念的,也就是说你这里是一个U的类型的引用变量,它指向了一个UR的对象没有问题,但是它能不能指向其他类型的对象呢?比如U的子类可不可以?这是有可能的,对吗?诶好,咱们试试啊,咱们创建一个class,咱们叫child,然后呢,我们继承咱们的U。
03:03
好了,我写完之后,我把这个child呢,我放到这边没问题吧,我们再来运行。运行以后你会发现程序的执行是正确的,还是我们的TEST1,这就说明啊,咱们之前的多肽是没有问题的,来咱们这里叫多肽。我们的U的类型的一个变量可以指向它的子类类型的对象,没有问题,对不对?好,那么这个时候我们在这个child里面,我们增加一个新的方法。这个方法的名字呀,我们叫TEST2,我这里写上TEST2好了,然后呢,我在这个地方复制一下,把这个一我们改成二,大家有没有发现我们当前的这个TEST2怎么了,它已经标红了吧,你标红了以后,这就说明这个TEST2这个方法我们其实是用不了的吧,对不对。哎,我想要获取这个具体的子类对象当中的属性和方法,我们获取不到,对吗?诶,你好好想想是不是这样的,其实这个问题的原因咱们之前讲过,就是一个对象它能用什么方法,并不是取决于他有什么样的方法,对吗?它取决的是它的这个引用变量的类型。
04:10
我们这里的引用变量的类型是U的,所以它能用的这个方法一定是UR中的方法,这个大家能不能明白?这个我们说过了,在咱们之前多肽的视频中,我们其实是讲过的,就是当你声明了这个对象引用变量的类型之后,你等同于把这个对象的使用场景给它做了约束,那么你做了约束以后,你后面的对象到底是什么就不重要了,反正你什么样的对象都得在这个场景当中去使用,也就意味着你必须要表现为当前场景下能使用的属性和特征,对不对?诶,所以啊,我们还记得之前给大家讲那个内裤穿在外面的超人的例子吗?好好想想,琢磨一下,还记不记得啊,咱们当时是讲过的。如果你能想明白这个事情的话,那好了,我们有的时候啊,我不管场景是什么,我就想用自己对象中的方法,难道不行吗?对吧,我是个跳的,我就想用它里面的那个TEST2,这个方法难道就不行吗?其实啊,也不是不能做到。
05:09
诶,咱们之前做不到的原因很简单,所以因为我们把这个地方写成了U的,那咱们就约束了它使用的一个场景问题,所以在运行过程中,我们后续的代码你会发现他就不知道这个U是一个child,他不知道。他如果不知道的情况下,他怎么知道里面会有个TEST2呢?这就不可能,诶,所以啊,如果我通过一些语法能够在运行过程当中我知道它是什么类型,那它里面的方法我不就能用了吗?对不对?哎,这就好比啊我们照镜子一样,我不知道自己长什么样子,诶我通过照镜子呢,反射出我的样貌对不对,那我们这里也是一样的,我们通过一种特殊的语法在运行中我得到我的类型。对吧,我平时得不到啊,我这里能得到,我再通过我们的类型来找到我们的什么属性和方法,那不就行了吗?诶,所以啊,这些都是跟反射相关的,所以咱们接下来就给大家介绍一下反射的相关语法,那么这里呢,我先把它注掉。
06:08
生活中啊,我们想看看自己是什么样子呢?我们首先都会通过照镜子来获取整体的一个外观,对吧?然后呢,看看详细的一些什么脸型啊,眼睛啊,眉毛啊,头型之类的,如果你睡觉起来发现头型啊不太好对不对?你是不是会拿梳子梳一下,或者拿那个水啊扒拉扒拉对不对?那咱们代码中其实也是这样的,我们应该先通过反射的方式来获取我们的整体的对象,那这个整体对象呢,我们就称之为叫做类对象。那么怎么获取这个类对象呢?很简单,U的点它里面有一个叫get class,这个get class呢,就可以获取我们的类对象,所以我们点一下,诶,把它补全,补全代码以后,大家会发现这就有一个对象了,它的类型呢叫class,这个class呀,它是我们的什么Java点浪包里面的,所以啊,我们不用做任何的引炮的操作,什么都不需要就可以了啊,那好,那这个有什么用呢?这个对象呢,就是一个我们的类对象,那么怎么理解这个对象呢?其实很简单,因为Java是万物皆对象嘛,所以把那个编译后的自解码文件也可以当成对象,那么就是我们当前的这个地方的class对象了,那么这个class对象里面到底都有什么?其实就要看看那个字解码文件里面有什么了,所以啊,我们接下来就得了解一下字解码相关的内容了。
我来说两句