00:00
各位同学大家好,下面呢,我们继续来回顾反射的相关内容,刚才呢,咱们分别演示了获取class对象的多种方式,包括如何来获取类中的构造方法,然后下面我们演示第三个和第四个获取属性以及获取方法。那咱们先看获取属性过程,我在里边写个方法,咱们来测试一下。然后把方法加上public,我们叫TEST03。加上这个方法。然后在里边我们来进行具体实现,首先第一部分咱们肯定得到类的字节码文件,就是咱说的class,那我在里边直接得到一下就是点,然后得到我们这个值,我就叫SA。这是我们的第一部分,然后得到之后,下面呢,咱来获取属性,这里边特别说明啊,和刚才的机制一样,如果说啊,你想得到类中所有属性,因为大家明确这属性呢,可能有private私有的,可能有公开的。
01:07
那里边怎么做我写一下啊,如果说你要获取所有的这个public属性,那咱可以用里边有一个方法,这个方法我写一下叫get fields。通过它得到所有的public属性啊,但因为我这里边还没有公开属性,但都是私有的,这个我就不测试了,咱用它完全可以得到,而现在我想得到里面的私有属性,那怎么做,咱们继续来演示。写一下啊,获取你的所有的这个属性,这里边包含咱们那个私有的属性,那这个我们该怎么去做,下面我来演示一下它的做法,就是呢,用class里边有一个方法叫get declare。Field。通过它来得到做的属性,我们给它起个名字,就叫这个fields。
02:03
就到它了啊。呃,这一行我就先注掉了啊。通过它,然后得到之后,注意它是一个数组形式,咱们把数组给它做一个便利。然后得到里面的每个属性。我就叫。啊,每个属性。就是他。现在我们就得到了,然后得到之后咱可以把属性我们进行输出,包括它的结果内容,那这里边比如说我先做一个简单输出啊,咱就用这个field,点上这个get name,把它的名字做输出,我们先看一下它的基本效果,然后一会儿我们再进行属性的设置值,再进行测试。现在咱们先执行一下啊,看一下这个属性能不能得到。大家看三个属性是不是得到了name age。还有这个看。属性得到之后呢,下面呢,比如说我想做件事情,我想要向属性中哎设置它的值,那咱们看怎么做啊,咱就直接写个场景,比如现在我想向那个name中设一个值,咱看怎么做,我这位置首先我先做个简单判断,因为这是得到那个属性的名称,根据它我们做一个简单的判断,我这里快给我写一下啊。
03:23
位置field get name,点上equals,如果它的这个名字是name,就属性名字是name,那咱们进行指的设置,怎么设置强调啊,第一个你先需要设置一下,它允许进行访问。允许访问。你先做个设置,跟刚才咱说那构造类似,这里写一下啊。就是用里边那个。Field。里边有个方法叫get access,咱们加上一个把它变成之后才可以访问,然后通过field里边有一个方法咱进行设置,呃,不是这个啊,Field。
04:09
里边有一个方法叫set set里边呢有两部分,第一个是你这个对象,第二个是你设置的值,那这对象咱给它做一个实例化啊,把对象给他实例化出来,我就写到我们的这位置了啊,给他实例化一下啊。用点get。Declare field.new。这个写一下啊,然后new给它做一个实例。然后这里边我们用这个car,因为咱是car的这个对象。这个位置做一个强转。啊,给他做到啊。比如说现在在这位置,第一部分传你的对象,第二个传你的这个名字的属性值。比如现在我穿一个汽车的名字就是这个,比如说五菱宏光神车嘛,五菱宏光现在咱们就完成设置,完成设置之后,最后呢,我就把这个咱们最终给他输出一下就可以了。
05:13
我们做一个测试啊,把这个卡最终进行输出,因为这个car里边呢,我刚才已经生成它这个。To string方法咱看有没有啊,没有的话我给它生成一下,呃,没有,那我生成一下to润啊,我咱输出看着方便。To string生成,咱就看一下最终内幕中有没有这个值,这就是针对反射如何操作属性,咱们先测试一下,最终把这过程给各位再重复一遍。然后大家看啊,这里边这值是不是有了,看五菱宏光啊,咱们做到这个过程。这是咱们提到的啊。比如说现在咱们把这个最基本的过程应该就做到了,然后做到过程中给各位再重复一遍啊,它的做法就是首先你可以用get fields得到所有的属性,但这个得到的只public,如果你想还得到私有属性,用这个方法get declare得到,然后在里边我们要设置它允许访问,最终是它的值,然后最终得到你这个结果。
06:21
这就是如何操作类中的属性通过反射进行实现。属性呢,我们就演示到这里,然后咱看第四个就是如何来操作方法,咱把这个最终快速演示出来,因为思路跟之前都一样,就是最终是操作方法,方法里边的最终咱就让方法可以进行执行,那我们写最后一个。然后最后一个怎么做呢?首先第一部分跟之前一样,咱们也是啊,就是建一个这个实例化这个对象,那我这里边我来写一下啊,比如说我现在,呃,我换一种写法啊,之前写也没有错,咱为了后面方便换一种写法,比如现在我直接new一个car。
07:02
在new这个对象,呃,为了方便这个我还是给它改成这个public咱们对象,然后通过有参构造向里边来传入它的切换参数,咱就传入里边几个值,比如第一个这个汽车的名称啊,咱随便传个汽车名称,比如这个汽车是这个什么。啊,什么奔驰,然后第二个年龄就是他开了十年,第三个颜色还是这个。就是这个黑色。这个现在我们用这个对象,然后完对象之后得到它这个class,用get方法把这个得到,所咱把这些方式咱都用一下,这有一种方式通过对象点class得到对象,这是第一部分,然后得到之后,下面我们来演示,演示什么呢?给大家写一下,咱就分别演示操作它的public方法以及操作它的play方法,通过两部分进行演示。
08:05
写一下啊,这是public方法。然后这个是private方法,咱通过两部分我们进行演示,那下面咱们把这个我们来往下写一下。首先啊,我们先操作它这个public方法,那咱们看怎么来做啊,在这里边呢,我们用Z里面一个方法叫get methods,这得到就是所有的方法,然后得到之后咱把它可以给做一个,最终把方法输出。这个位置我来写一下,这个叫method,咱们叫M1。遍历methods这一就是里边的做的方法,那这个方法咱们先简单做个输出get,把方法名字我们先输出一下,看一下方法有哪些,然后咱们试一下啊,这就是得到所有的public方法。
09:04
大家看方法是不是输出了,有这里边我们写到的,包括有它那个object类中的这些方法都有,当然各位仔细看啊,这些方法中,刚才我故意写了一个方法叫run,这一方法你发现里边。他是没有啊,肯定没法,因为这个方法它是私有的,他得到的只是public方法,这个咱们做到,然后做到之后呢,比如说下面啊,我想让里边的某个方法进行执行,那怎么做写一下啊。这位置执行某个方法,那做法其实很简单,用method中有一个方法叫以就可以了,然后里边入你对应的参数,但是现在因为我方法很多。咱不让他都执行了,我们就执行某一个方法,比如说我现在啊,在里边有一个to string,我就想让这个to string方法进行执行,用它做个测试。
10:05
啊,当然你执行别的也可以啊,我就执行two瑞,那咱来写一下这个代码。首先我做一个判断。根据方法名字咱们判断一下,如果方法名字等于这个突死准。这个,那咱们让方法进行执行,那怎么执行很简单啊,咱直接用这个写一下啊就是。M1里边这个叫已进行执行,然后在里边传入它相关的参数就可以了,这就是to string,通过它可以最终进行实现。然后调的时候呢,里边需要传参数,这个游个方法中呢,有两问参数,第一部分是你当前这个对象,第二个是里边其他参数,比如说这方法中可能有名称有别的值,但to中没有别的参数,我就直接传过对象可以了,就上面这个car,这样的话,这方法就最终执行了,然后执行之后大家看啊,它返回的是一个死类型这一个字符串,大家给它就强转成这个死缀字符串,然后把这个字符串给它最终做个输出。
11:18
这个evoke啊,这里为了明确,可谓加一个注释。To string方法。执行了。这个是我们让方法进行执行,所以以上啊,就是我们演示的,在我们这里边怎么去操作public方法。这个咱们就讲到这里,然后咱们测试一下啊,试一下这个效果,看它是怎么样的。咱们执行一下。大家看啊,突死这是不是执行了,然后把这输出了,就是奔驰十黑色是我刚才设置的这个纸。这个咱们讲到这里,然后之后下面我们继续来演示啊,咱来演示一下里面这个privateway的方法怎么实现,这跟上面类似,只是说把这方法各位应该很清楚啊,都改成这个加be declare这个方法,那咱们下面快速试一下这个部分啊。
12:14
我这里写下。首先我们用Z的方法get declare得到是它的所有方法,这一方法中包含咱们说那个私有方法,那比如这个方法我就叫methods o啊,为了区分。然后之后呢,把它做一个便利便历,跟刚才应该说是类似的,对不?这个过程啊,咱给他快头复制遍历一下。这个叫methods o啊,咱就叫。然后之后呢,在里边,比如现在啊,我同样想执行某个方法。但是方法执行各位注意啊,如果说你现在执行我们的公开方法就是public方法。
13:05
那跟之前应该没啥区别,咱这里边为了明确,我们就执行一个私有方法,然后最终进行实现,那咱们找一个私有方法,我刚才写了一个方法,我现在就想让这个run方法进行执行,那咱们看怎么来做啊,我在里边写一下。首先加上一个if判断。就是m.get点上equals表示这是方法,然后加上之后在里边我们进行就是具体这个实现啊,咱做一个具体实现。啊,这括号一会咱俩解决啊,咱先把这个核心逻辑起来,然后再说那个补助的问题啊,然后现在之后呢,我们要用这个方法执行,但是执行的话呢,你现在啊,并不能直接就是把它执行,就是按按照我们刚才的写法,比如你说加个M点上EVO,不能这么做,因为它是私有方法,咱们需要在里边呢做个设置m.set setable等于表上它执行,最终我们执行。
14:12
加上看,然后最终得到你这个结果。啊,因为我这个方法应该没有反应结果,再让他直接执行就可以了。这就是我写的这个,让私有方法进行执行。各位记住这句话啊,你说你发现啊,不管你是操作构造还是属性还是方法,只要它是私有的,咱是不是都加着这个方法是它允许进行访问。这个咱们就点到这里。然后最后呢,我们进行最终的测试,试一下这个效果啊,这里边应该多了一个括号,我把这去掉啊。做了一个大块去掉,然后为了明确啊,这段话我先给它注掉,要是咱看着不方便,咱就直接,然后这个方执行,因为我刚才有个输出说私有方法乱执行,那咱们最终试一下这个效果。
15:05
注意这里边不要写错,我这里应该都是正确的啊,然后咱们最终执行。看最后的结果。大家看一遍啊,私有方法转是不是执行了,所以以上啊就是咱们回顾的反射中的内容,最终我再重复一遍啊,第一个咱们演示了获取class对象的多种方式,你可以通过类名点class对象,点get class class.full name可以得到,然后第二个演示实例化第一,然后下一个内容演示了如何操作构造,包括你是public,包括你是private的,然后下一个演示如何操作属性,以及最后一个演示如何操作方法,包括让方法怎么进行执行,以及这个私有的这个特点,对,要设置它这个accessable等于执视处。这就是反射中的相关内容,咱们一会儿手写LC过程中要用到反射中的这种机制。
我来说两句