00:00
那么接着的话呢,咱们来说一下这个反射的叫应用三,这个应用三的话呢,就比较重要了,就相当于我们前面提到的说这个第二点获取呢,运用室内的完整的内部结构,那我们这个三的话呢,在开发当中,它使用的频率呢,仅次于我们一开始呢,创建运营室类的对象。或者换句话说呢,我们造对象的目的呢,不也是为了调相关的一些结构嘛,所以呢,我们一般不会去获取所有的结构,而只是呢,会去调用指定的结构的。所以这块呢,我们要讲一下,调用指定的属性,调用指定的方法,调用指定的构造器,那调用指定构造器呢,实际上呢,就是。来创建对象的啊,就来替换呢,我们前面提到这个newce这个方法。好,那么首先的话呢,我们来看一下,第一个要调用指定的属性。诶,调用指定属性这块呢,我们就在它下边呢,去新写这个具体的代码了啊,这个我们就都写到一起了啊,所以呢,就叫做reflect。哎,关于它的一个测试。OK啊好,这块呢,我们首先来说一下叫啊反射的应用三。
01:03
哎,这个三里边儿呢,我们讲第一个啊,这个我们叫调用指定的属性。OK啊行,那这块呢,我们就开始来做这个具体的测试了啊先写呢第一个啊。调用指定的属性,那针对的还是我们这个person类,Person类里边这个属性啊,特点呢也不一样,你比如说我们这有一个public权限的这样的一个A属性是一个实例变量了,这呢也是个实例变量,它是一个private的,我们这儿呢,还有一个static个修饰的叫类变量。哎,这个情况呢,也不一样,那这几个里边呢,大家的直观感觉一下,哪个呢是比较容易获取的呢。应该是这个权限比较大的是吧,OK啊,所以这块我们先来一个简单的啊,针对我们这个age呢,咱们进行一个获取,那就是读出来它这个一的值,然后呢,给它设置,比如给它改成是一个二这样的一个场景,OK,那么回过来啊,这个我们把其他的都关掉啊,把这个呢我们打开,首先呢,诶,咱们这里边针对的就是这样的一个属性。
02:01
啊,针对于它了啊好,那么这个属性的话呢,发现它也是非静态的了,那我们要想获取它的值,那一定呢是跟对象呢去打交道了,所以我们这时候呢,其实也得去创建当前我们这个person类的一个对象了,啊那创建对象的话呢,还得使用到我们这个应用一里边提到的这样一种方式了,所以这块呢,我们首先还得呢,先获取大class的这个实例了。哎,这呢,我还要这个class了,这呢,咱们就还用比较简便的这个方式吧,哎,我就还用点person点诶class了。这样的方式行,那么首先的话呢,这个我们说的第一步呢,你得去创建一个person类的一个实例了,啊这块呢,跟我们前面这个逻辑一样,咱们就先这样子啊来去做了啊这块呢,就得到了一个具体的person的一个对象了。啊,这块呢,我们先把这个异常呢给大家诶抛一下,这里边呢异常会比较多一些哈,我就直接呢先给大家写成一个比较大的了,啊这块呢,做一个强转行,这个咱都比较清楚了哈,然后下边呢,开始正式的开始针对这个属性的获取和调用了,那首先的话呢,我就把这写成第一步了哈,我们需要有能力呢,获取当前person类当中名字叫age的这样一个属性。
03:08
啊,我在这写一下啊,叫获取运行实类中。哎,指定名的属性。哎,现在我们有这样的一个需求啊,那通过我们这个class点它呢,有相关的这个方法支持,比如这块我们可以用一个叫get field,注意不是fields了啊field,然后呢,这个参数位置呢,就写上这个名,咱们呢要找这个age这个名的一个属性了。好,那么调完这个方法以后呢,它会自动的有一个返回的这个值,这个值呢,是一个F类型的啊,就是我们说Java点浪包点reflect这个子包下的啊,这样一个类,哎,咱们就叫做一个age field吧。行就它了啊,这样呢,我们就获取这样一个属性了,获取以后呢,哎,我们说这个下一步干什么呢,我们就要调用它的这个值了。那因为呢,这个属性呢,它是一个实例变量了,我们得跟这个对象打交道是吧?哎,所以这块呢,我们得这样了哈,Age field哎,你需直接呢获取它的值,你得说清楚是哪一个对象的啊这个属性的值了,所以呢,就是P2这个对象的。
04:14
那就这样就行,那获取到以后呢,咱们直接呢,把它呢,就给打印一下得了。诶,就是这样的操作,来run一下。嗯,这时候大家会发现,诶这块呢,他给我们报了一个错误的信息啊,说那叫非法的access,针对谁呢。啊,这里我们当地这个person是吧,Person的话呢,我们过来看一下。啊,这块呢,我们写成是一个默认权限了,这个呢就差点意思是吧,所以把它呢,加上一个public。哎,这块呢,报的的异常呢,针对的是他出现的啊来我们再去做一个run。OK啊,这时候我们就成功了啊,然后呢,这个位置呢,是我们在这块呢调用的,哎,下边呢,就我们get这个啊,当年这个person这个A值属性的值的时候呢,这就拿到这个一了。OK啊,这个呢是没有问题的,行,这呢,我们现在就要获取这个属性的值,那我们也可以去设置啊,这个设置的话呢,是这样来操作了啊a field这叫get了。
05:09
这就是sat是吧?S我们P12这个对象A的这个属性的值就改成是二。那你这时候呢,再去get,那就变成二了。诶,你看这事没问题。OK啊,所以这块呢,就体现了我们去叫哎获取或设置词属性的这个值。诶没问题啊,行,那我们就搞定了,那么搞定以后呢,注意这块呢,大家先了解就行,了解一下就行哈,因为呢,它不具备这个通用性,什么意思啊,你看这个A呢,比较特别,它是public权限的,诶紧接着的话呢,我们试图呢,去操作一下这个private权限的这个name。显然的话呢,会有一些难度。哎,我们就再来一个是吧。啊,针对他,那我们把刚才那个代码呢,原封不动拿过来,我们看看行不行啊。这个呢,我们拿过来这个位置呢,不用动这个位置,我们改一下这个叫name了。
06:00
这个呢,属性名呢,咱们也调一下。哎,关于name的这个值啊,然后首先的话呢,比如把这个呢,我们先暂时注释掉啊,针对我们这个name field呢,我们去获取它这个值。这个呢,先不用管它。好,那么获取这个值的时候呢,我们走起一下。啊,按说呢,没有复合值就是no啊,此时呢,你会发现呢,他出都出不来是那叫no such field exception。没有这个属性是吧,他在这个46行出的哈。在这个位置出现的。啊,还没有到下边呢,啊,现在我们这个类里边呢,没有这个属性。其实呢,显然是有的哈,那为什么他说没有呢?就是因为权限的问题。所以这块的话呢,基于咱们前面讲这个应用二的时候呢,大家应该稍微有点印象啊,当然咱们用的是这个哈,这是获取当前这个类里边的所有的属性的时候呢,发现呢,这种调法呢,只能获取public权限的。啊,你要是调这个有个叫get declare的这样的一个方法,他呢就能获取呢,跟权限没关系的所有的属性了,所以这种declare的这种呢,其实就跟权限的没影响,所以回过来诶,受这个启发呢,我们其实对应的这个方法呢,也给他加上一个叫declare的。
07:10
哎,这样的去写。Get declare的这个field,这时候呢,不管你权限是什么,我就呃,只要呢,你这个写对了,我就都能够找到了,好,这时候咱们再去做一个run啊。这时候转的时候呢,哎,注意他报的异常呢,变了。刚才呢叫no such field是吧,现在不是说no such field illegal access exception非法访问,它呢是在50行。刚才那是这行报的,现在他不报了,这行报了。说了你不能够访问。啊,这个呢,还是因为我们这个权限的问题,私有权限呢,咱们说默认呢,就不能访问了。那要想访问怎么办呢?你不是非法的,然后这块呢,我就在我们问之多一个方法,拿着这个点叫access改成个。
08:02
啊,Access呢,就是访问的意思啊,你不是不让访问,我这就让访问D呢,默认这个值呢是false啊。这个加上以后呢,我们再去get枸杞。你看这时候呢就可以了。那因为呢,没有负过值嘛,所以它就是个not值,那我们可以呢,提前呢,给它负一个值,是针对于我们当前那个对象负过值,嗯把它改掉,比如写成叫Tom了,这时候你再去这个做get的时候,哎,Tom呢就出来了。那这个呢,可以作为我们一种通用的一种设置方式了。啊,你想我们现在这个私有的话呢,可以这样写,那你公共的这个age呢,是不是也可以这样写。对,那既然都可以这样写,我们把它呢当成一种通用的方式啊,比如第一个诶,获取运营室类中指定名的这个属性,这个我们说使用的是这样一个方法。啊,这样这样说啊是呢,叫通过哎class啊调用啊,我们说的这个方法。
09:00
这个方法的话呢,它呢写一个string类型的,我们这个field。哎,它的一个name就可以了。看通过我们这class啊,注意是class的这个实例哈,不是一个静态方法了。调用这个方法,然后呢,获取运行实类指定名的这个属性第一步,然后第二步。哎,然后呢,确保。哎,此属性是可以访问的。啊,然后呢,这时候我们调用的是这样的一个set改成。诶这样的一个操作啊,这是第二步了啊,然后呢,第三步的话呢,诶相当于我们就是通过相关的啊,就是调用我们这个field这个类里边的get方法呢,这个我们叫访问下方法呢,叫做设置。啊,这个我们可以写的详细一点啊。那通过。哎,Field这个类。的这个实例啊,我们去调用这个get,这呢就是我们具体的这个对象了,那这个方法呢,或者是。
10:03
欧。诶,然后后边这个呢,就是你给他赋值嘛,诶也是一个算是object类型的一个。哎,咱们的一个Y6值啊。调用这两个方法,然后呢进行操作。OK啊,然后这个呢,我们就相当于是一个获取的操作,这个我用这样来写啊。哎,后边这块呢,就是一个,哎设置的一个操作。哎,这就可以了,好,那我们把这三幕呢,就看作是呢,咱看是呢,咱们调用指定的一个属性的一个通用的步骤了,哎,我们就可以呢,把这里边呢去写一下啊这个3.1我们呢叫呃调用指定的。那这个属性啊,它的这样的一个步骤啊。这个步骤呢,就是咱们刚才写的这个事儿。哎,在这块是吧。把这个呢,我就相应的就拿过来了啊CTRLC。
11:01
哎,这是第一步。啊,第二步。哎,第三步。嗯,OK啊。那这么着,然后这呢,我加一个啊叫哎步骤。啊,这就可以了啊行,然后这块的话呢,咱们针对的是这个person类当中,哎,我们的这样的两个属性都是非静态的,那他这块还有个静态的属性,那静态这个属性调用的话呢,我们会想说会不会有什么不同呢,咱们过来呢再同样的测试一下。哎,咱们呢,现在针对的就是诶这样的一个属性啊,看看这个步骤呢,跟他是不是一样的呢,来我们把它呢,还原封不动的咱们粘过来看一看。行,这个我们改成是这个三了,那因为呢,这个属性呢,是个静态的了,咱们自然而然也知道呢,就是在调用这个属性的时候呢,是不是跟对象就没关系了。IG呢,就是我们前面这个造对象这个事儿呢,其实是不是可以考虑的给省略了。诶没问题啊好,然后这块呢,还是获取我们指定这个名的这个属性了,咱们现在呢叫in inform。
12:02
哎,我就改成叫in for了,前面呢,我们也调一下。你看这就in符了啊,接下来的话呢,都得是由因由这个in符呢发起的,没问题,好第二步呢,不管呢,你这个属性是不是一个权限不够的,总之呢,我都给你加上set赛,你是public呢,我加上也没问题,这第二步然后第三步,然后我们去这个获取啊,或者去设置啊都行啊,先看这个获取吧。通过它呢,我们去get,注意这个位置呢,既然呢是静态的不用填对象了,那我们要填什么。它这个位置呢,它不是可变形参是一定要填的,对吧。嗯,大家可能会想到是不是就填累了。眼泪,那怎么写?解。哎,不能写person啊,Person的话呢,是一个类型,是不是点class,这才是一个实体的值了是吧,所以呢,得写person.class啊好,这个写完以后呢,我们做一个run。看,这不就出来了吗?哎,没有这个值是吧,好,那上面这块我们要设置的话呢,同样的道理,你也得是不是把这个person加class呢,给它写上呀。
13:03
哎,然后这块呢,比如是个in for in for呢,我们就说,哎,我是一个人,比如说啊好,这时候我们再去做一个盖的操作,这不就出来了吗。行,这个是不是挺好理解的。没问题是吧。OK啊行,这个完了以后呢,我多说一句啊,其实呢,大家真正在写的时候呢,你会发现发现什么呀,哎,这呢,咱们如果看成是一种写法的话呢,我把这一组呢,我注释掉啊。我这样写。这个我们去调这个属性,这个位置呢,需要指明的是谁来调的,我们说类来调的,所以我们写成类了。啊,不用对象调,我们也没造对象,其实呢,你发现呢,这个位置如果写成是个闹。也可以。Get的时候呢,写个no呢也行,首先你不写肯定不行,他这又不是可变形参的是吧,必须要传个参数了,但是我写的是no。是没问题的。来,我们再去跑一下。哎,你会发现呢,设置也成了,Get呢也成了。
14:02
是吧?啊,这个呢。能理解不?谁说长了?你说能是吧?哎,按说的话呢,是不是拿泪去掉是吧,这怎么写个闹也行呢。嗯,其实呢,也能理解啊,你想咱们原来呢,去调用一个类中的这个静态这个属性的时候,这个权限如果允许的话呢,咱们直接拿类去点是吧,你要不拿类去点的话呢,我都不知道你是哪个类里的呀。所以你一定得是累点才行。是吧,但是我们在这个位置的时候呢,由于咱们这个获取这个属性的时候呢,你通过是class获取的这个class不就知道你是person吗。相当于我们这个属性拿到的,这不就一定是person里的吗?对,我已经知道是这个类里了,所以这个位置呢,其实传不传呢,无所谓了。或者换句话说呢,就是你上面传了吗?你传了其实我也没有用你。传也白传。所以呢,里边根本没有用,所以你写个闹呢也没问题。但是你这个属性如果要是一个实例变量的话呢,就必须要传了。
15:04
因为我们对一个对象来讲的话呢,我们才有实力变量,你要这个类的话呢,是不会有这个实力变量啊。这个大家要注意一下。行,这有个小细节,相信大家了解一下就行啊。这个呢,我们说呢,诶或是吧,还可以这样写,这呢是仅限于静态属性啊。或者叫类变量啊。那这个我在这儿稍微的写一下啊,仅限于类变量,哎,可以如下的这个方式呢调用啊。好,那么调用指定的属性,哎,我们就说清楚了。好,那么接着的话呢,我们说下一个啊,叫调用指定的方法,嗯,我们同样的去总结一下相应的这个步骤,直接呢,咱们回过来呢,开始去写。啊,这块我们加一个这样的一个注释信息啊。哎,这样拉一条线一个呢如下,哎是调用指定的,哎方法。把这块呢,我们再这样一下。
16:01
啊,这个我们写到这儿吧,调用指定的属性。嗯,这么着啊,把这个呢,CTRLC。哎,拿过来。调用指定的这个方法。好,那么方法这块的话呢,其实这个情况呢,也是各不相同,咱们呢,就先试图呢,比如说要是挑一个一般的话呢,那就考虑的话呢,我们就调一个这种公共的方法了。像这种情况的是吧,哎,那由于呢,我们已经有属性这样一个经验的积累了,咱们干脆呢,就没有必要呢,非得这样引入一下,先去调get method,然后呢,一会儿发现呢,私有的话呢,还用不了再get declare了,咱们已经有这样针对于属性的经验了,咱们就上来就直接奔着这个私有的去得了。所以上来呢,我就直接调这个方法了。哎,CTRLC一下啊。哎,把这个方法呢,为了方便我们去看它,我就改到这儿了啊。好回过来,现在呢,我们就想调用。哎,咱们这个方法,这个方法的话呢,它这个私有的了,所以咱们有上面经验的话呢,上来就直接也是get declare的method了,就啊它呢,因为是一个非静态的方法,所以呢也得创建对象啊。
17:08
这咱们就开始写了。哎,三应该有了四是吧。好,这个一开始的这个代码呢,这都一样啊。这个都得有,然后因为呢,你是一个非静态方法,所以呢,首先得创建对象。哎,通过它呢叫newcens,咱们先用着它啊,这呢就得到一个具体的person了。啊,这个异常呢,我们先抛一下。这个呢,后边也有其他的异常,直接呢,我们就整一个比较大的了,做强转。好,这呢都是必要的一个步骤了,接下来我们呢,算是第一步就出现了啊,要获取当前运行实例当中指定的这个方法,这呢我们就通过这个class.get declared method。啊,然后呢,方法首先呢,告诉我名啊,叫这个名。那前面我们也提到过啊,这个方法呢,在一个类当中是可以定义多个同名的了,这叫重载,在后边呢,你还需要呢,告诉我相关的这个行参。
18:05
哎,我们现在这个形态呢,是string类型和int类型,先后顺序呢,也是有要求的,所以你是先string。所以后边这块写的时候呢。一定要写成int.class。不能够写成in class。啊,这个大家要注意,咱们先说一下啊呃,然后这块呢,咱们也可以去演示啊,然后这块我获取到以后呢,前面我们就得到了这样的一个method了,这个method起个名,比如说就叫做的一个method吧。哎,就这么着了,行,你看这块我们就获取到它了,咱们先呢run一下。OK,那此时呢,是没有问题的哈,那如果呢,你要是把这个T呢改成叫了。是吧,啊首先呢,这块也没问题啊,当然我们这块在获取的时候呢。就报错了啊,说no such method exception说那你就根本没有这样的方法。哎,主要原因呢,是因为你这个参数呢写的不对了,这个大家能够理解为什么int对这时候就不能写吗。
19:06
这板不对是吧,诶不是有自动装箱吗。装不了啊,对,道儿虽是装不了,为啥装不了呢?诶对,诶同学我听见说的是对的哈,你注意啊,咱们前面说呢,你看in呢,是那个I这个呢,比如是五,然后呢这个TE。啊类型的一个我就接了,我这拿这个I呢去负的值,这叫自动装箱是吧。咱们指的呢,是你不同类型的它们的值。可以自动装箱,但是我现在不是纸,我是类型啊。这类型他俩可没说呢,可以自动装箱。啊,这个注意是完全两个不同的类型,换句话说呢,咱们这个in加class,这不是算是个大的class的一个实例了,然后跟加class显然是两个不同的实例啊。那你这块呢,本来是印的,你写成一点,那能一样。
20:01
显然不一样是吧,所以这个呢一定要清楚啊,不是说呢,你看到它俩呢,就都能装箱值才能够自动装箱类型不行,好这呢我们就能获取到这样一个方法了,那同样的原因哈,这个方法呢,有可能权限呢是比较小的,我们得保证它能够去调用了,所以我们得把这个方法呢叫set一个accessible是吧,诶改成是个出的。这样的话呢,它就能访问了啊,然后第三步的话呢,我们就真的来调用这个方法了,调用的话呢,怎么调呢,诶这呢,我们就直接呢,拿着它呢去调一个叫invoke invoke就是理解成叫调用的意思了。那那正常来讲,我们这个方法呢,是一个非静态的拿对象去调,对象呢是一个结构了,另外呢,你这个参数也得填上这个实参了,所以呢,这个引用方法呢,这个参数信息呢,也比较清晰,首先呢,谁来调啊PR这个对象调。好,掉的时候呢,你得传13吧。哎,上面这块呢是行参,这块呢就十参,上面有几个,这就填几个,这叫show nation啊,那这块咱们来一个比如CHN啊,然后后边这块呢,有一个叫age,就是十。
21:05
你看这样写的。好,我就写完了啊,写完以后的话呢,我们这个方法呢,就调用了,调用的时候呢,它就会执行这个方法里边呢,你看有一个输出语句。啊,有个输入语句行,目前呢,咱们就先写成这样好起来。来看一下啊,这个呢是咱们这个构造器的事儿,下边这个呢叫show,哎,不就是这个吗。然后接下来你会发现呢,我们这个方法呢,是有返回值的哈。那么这个防御值怎么在这儿体现呢?对,我们这个引这个方法呢,你会发现呢,它也有一个返回值。这个方法的返回值就是咱们对应的啊,Show这个方法的返回值。哎,这个就很清晰了,所以说呢,我们就可以呢,去接收一下,比如说object类型的,我们叫return。Value。啊,就这样啊好,那么这个return value呢,当然了,咱们知道这是个字符串,你要愿意强转了,你就强转啊,不强转的话,你就直接在这块我们打印一下也行,好,这是我们要是打印这个值,其实就拿到的是这个数据。
22:03
哎,走起来。你看你看,这不就出来了吗。哎,这个呢,就咱们调用指定的方法的这样的一个过程,好了,把这几个步骤呢,我们说一下啊,这个呢,我们是诶通过哎大的class这个实例啊调用。这个方法。哎,这个方法里边呢,首先是string类型的一个叫method name逗号一下,然后呢,大家的class类型的多个这个参数,哎,通过调用这个方法呢,我们叫获取指定的这个方法。这第一步啊,第二步,哎,我们这儿呢,是使用的是这样的一个方法。啊,这个呢,我们来确保。诶,此方法呢,是可访问的。那主要呢,针对的就是这种像私有的这样的方法啊,来确保它是可访问的了,行第二步,然后第三步呢,这个我们就是通过你对应的这个method的这个实例调用invoke方法啊。
23:02
哎,实例调用啊invoke。这个呢,这里边儿也有这个对应的参数了啊,第一个呢,就是你对应的这个对象。哎,就是谁来调的啊,这意思后边呢,你上面不是这个叫行参嘛,哎,那这块就是这个十参了,十参我就写成我不这类型了,那这不就多个这个具体的obj s吧。哎,调用这个方法,然后呢,就是呃,极为。哎,我们通过method的实例呢,调用这个方法说极为呢对。啊,这个method对应的。啊,这个方法的一个调用,那在我们这个题目当中,就是我们这个。哎,它这个调用啊,好接着啊说这个invoke。这个方法的这个返回值。哎,说呢,即为这个method的对应的这个方法的返回值。OK,那这个事儿呢,咱们就说清楚了。那咱们知道了有的方法呢,是不是反回值是个Y呀。
24:03
哎,如果呢,有的方法呢,反应值是Y的话呢,我们这个隐卧或这个方法的反回值呢,就是个nor。啊,这个我们做一个特别的说一下啊。特别的啊,说如果呢,这个method的对应的这个方法的哎,返回值类型为Y啊,则咱们这个引物方法它的这个返回值为nor是吧,这呢是一个特殊情况就行了。好,这个呢,我们就把这个调用指定的方法呢,我们就可以写一个通用的这个步骤了。那这个CTRLC1下回过来,下边我们写一个这个叫哎,3.2是吧。调用指定的这个方法。啊,这儿呢,是咱们这一章讲反射的这个重点。OK啊,大家呢,需要呢,会去写的。哎,步骤一。哎,我把它呢都粘过来啊,步骤二。哎,相对来说其实也不是特别难,就比较规范啊,按照这个套路呢,你写肯定就错不了。
25:03
啊,粘过来粘过来啊。这个呢,就是咱们调用指定方法的这样一个步骤了,那我们这儿呢,直接上来呢,就拿着一个私有方法去说了,那公共的方法的话呢,往这套肯定是没问题的啊,那对应的话,我们在这个类里边呢,可能也会存在着这种静态的方法是吧。那静态这种方法的调用呢,哎,咱们类似于刚才提到这个静态属性一样,哎,大家应该也是有能力呢去调的,我这块呢,稍微的就演示一下啊。我们现在呢,换成了调这个方法。这个呢是一个静态方法,我把整个这个代码呢,咱们CTRLC粘过来。这个呢,我改成是角五了。好,那因为呢,你是静态方法了,所以对象呢就没必要了是吧。哎,这个的话呢,我们get declared是叫收音for吧。这样,然后没有行参吧。所以把这个数据删了。OK啊,这个呢叫收这两个方法,把这个我们改一下。然后下边呢,这不就是收银份呢,进行调用吗。
26:01
好这个啊,说这个方法呢,我不管你这个权限是什么,反正呢,我都让你可访问beside accessible没问题,好下边。刚才这个收infer这个方法呢,我们去evoke调用的时候呢,因为它是静态方法了,又涉及到这个位置怎么写。哎,对的啊,有我们属性这样的经验的话呢,其实这个位置呢,写no就没问题啦,然后因为也没有参数嘛,把这个都删一下就行了。这么着啊,然后得到了一个返回值,打印一下,这个方法呢,注意是个Y,没有返回值,那这里就是个no呗。嗯,然后P这里边儿呢,他打印了一句话啊,打印的这句话呢,是在我们哪个位置打印的呀。对,在这个调的时候打印的是吧。来,走起。哎,这能看就是我们看到这样的效果,所以这个位置上写no是没问题的啊。哎,这呢,就我们关于这个静态方法的一个调用,那么他呢,说完之后呢,我们关于指定的这个方法呢,这块就说清楚了,诶大家呢,就会去掉了啊按照这个步骤去写。好,那么接着的话呢,咱们还差最后一个叫调用指定的构造器。
27:04
哎,三杠三是吧。调用指定的。哎,构造器啊好,那这块呢,其实大家也知道呢,属性啊,方法呀,其实都有类似的这种套路,那构造器这块呢,其实也是同样的道理。看一下。诶,我把上面的这个呢,咱们粘过来啊,CTRLC。好,这个呢,就是调用指定的构造器。这块我们来去写这个例子了,这个呢叫TEST6。嗯,OK行,那我们呢,在讲一开始的时候,这个应用一的时候呢,提到了说呢,我们可以通过这样一个方法呢,调用这个类中呢空餐的步调器,但是这块我们发现这个要求呢比较高,首先你有空餐的构造器,其实呢这个权限还得够。哎,那你在这块呢,试图呢去影响他的权限是没有意义的啊,因为他已经这样写了啊,你权限呢,就得是回去呢,设置你当前这个类里边这个构造器了,这个权限不够的话呢,这个位置肯定是要报错的了。
28:07
呃,对应的就我们这样一个异常了,行,那万一说呢,我们这个类里边没有空仓的构造器,或者说有空仓构造器,但是权限不够,那怎么办呢?那显然呢,这个方法呢,就调用失败了,所以说这个方法呢执行呢不灵活。那我们怎么灵活了呢?那我就可以调用指定的构造期了。啊,咱们先拿个一般的来说,比如说找一个就他吧。它的就挺一般的啊,CTRLC一下我们就调这个构造器。看了啊,第二列构造器。哎,首先还得有大的class的这个实力。哎,这个我们还是使用这种比较简便的方式了啊,诶第class一下了,哎,那下边你就别整对象了啊,如果拿着对象去调,哎,要是有对象了,那就不用调构造器了。哎,所以呢,我们就直接拿这个class呢,哎,它呢点get,哎都有经验了啊declared constructor是吧。
29:00
这时候呢,这个方法里边呢,就不用写这个是哪个类里的构造器啊啊,因为构造器呢,跟类都是同名的了。所以呢,就是person这个名的了,直接呢你写参数就行了,诶这呢,我们是死string类型的一个参数。诶,点克拉斯,诶int类型的一个参数。哎,这就可以了,我就找到哎这样参数类型的这个构造器了啊,有异常我们就抛一下。啊,这个呢,它可能下边还有别的异常,我就还写成exception了啊好大家回车。这样的话呢,我们就得到一个构造器。哎,这个构造器呢,就拿到了好构造器拿到以后,这是类似于我们前面操作的第一步就有了,然后第二步的话呢,是不是同样的,有可能这个构造器的权限不够吧。所以呢,我们还是要把它的。啊,Accessible这块呢,得设置一下啊,还改成是一个出。这样的话呢,它就能够访问了,能访问了我们要做的事呢,不就是调用这个构造器来造对象吗?所以呢,拿这个constructor点。哎,这个造对象的方法呀,跟咱们刚才呢,用的class里边那个方法名是一样的,也叫做new instance。
30:04
啊,因为呢,你这块有参数,所以这块呢,就传这个13叭如来一个,诶Tom是吧,诶12岁哎这就造好了,诶造好以后的话呢,这块默认的返回的alt加个回车,他认为呢是一个object了。啊,因为这个constructor过来,那他有泛刑,咱们这块呢,这不一路呢,没有用泛型吗。所以呢,他就认为你是object了,那事实上呢,我们知道呢,这造的就是一个person了,所以呢,你要愿意在这块强转一下,咱们就直接呢写成person。OK啊,然后这个位置呢,Alt加回车旋转一下。行,那么这样的话呢,咱们这个对象呢,就创建好了,哎,我就直接呢,打印一下这个P2了,走起。诶,你看这时候是没问题的。这时候呢,咱们调的就是一个私有的,而且呢是带参数的这样的一个构造器。啊,这里边儿这三个步骤啊,这是第一步,这个我们叫,哎,通过大的class的这个,诶实例啊,我们说调用这个方法。
31:01
哎,这个方法呢,注意它有这个参数啊,不用写这个类名了,直接呢写你这个,哎,构造器的这个行参的类型就可以了,可变型参的嘛。哎,这个叫,哎参数这样写啊。通过调用这个方法,我们叫获取。哎,叫指定参数类型的这个构造器。哎,没问题啊,第二步通过这个方法,我们说要确保此构造器是可以访问的。代词构造器是可以访问。哎,乐。诶OK啊行,这是第二步,然后第三步的话呢,我们就是,诶通过这个construct这个实例呢,调用这个方法。是吧?这个实例呢,来调用new这样个方法。这个方法里边的话呢,诶,你就直接呢,针对你上边的填的是这个叫行参了啊这块你直接呢,就传这个所谓的食参就可以了,哎欧不类型呢,也是可变的哈。
32:04
这样啊,通过调用这个方法呢,然后我们就返回一个啊运行时类的一个实例。哎,就可以了,行这呢,就我们说对应的这样的三个步骤,那咱们也可以呢,把它呢写过来啊CTRLC。诶,回过来。哎,步骤啊,步骤一。这样啊。这个是第二步啊,CTRLC。哎,步骤二。诶这样就可以了啊好,那么回过来,诶,刚才这块呢,我们也运行了一下,那这不也出这样的一个结果了吗?没啥问题啊行,那既然呢,我们说呢,这种方式呢,是对原有的这种方式的一个替换了,那就相当于我们也可以呢,通过刚才啊这个指定的构造器的方式呢,来做同样的这个事儿啊,原来你一行代码搞定的,现在呢,可能得稍微再多写一点了,但是呢,替换呢是完全没有问题的啊。
33:07
哎,那我们回到这个位置,咱们下边也稍微的演示一下啊。说呢,使用咱们这个叫constructor。啊,来去替换。啊,原有的。啊,这个使用啊,这个class调用。哎,New incen这个方式呢,来创建对象。哎的这个方式。哎,创建这个诶对象啊,好,这块我们直接在就写这个测试了。其实呢,也没什么特别的,无外乎就是你现在调的是一个空参的构造器而已啊,整个套路呢,其实跟这块呢是一样的啊,CTRLC诶拿过来诶然后这个位置呢,呃,现在有这个异常呢,我们都提前呢,先都抛出来啊,直接呢整一个就比较大的了,这是我们只不过呢要调的是一个空参的构造期了,所以这块就不要洗了。然后这个构造器呢,有可能你就是一个public了,不管你是不是,反正我就让你可访问。
34:01
然后呢,下边你再调这个构造器的时候呢,自然而然的没有参数不要写了,那这时候我们调的其实就是空参的构造器。来,我们走起一下。哎,这不就出来了。诶,空间构造器在,因为我们显示的给这个A值赋值了,诶,所以这块呢,它有这个值是一的哈,这个是正常的。行没啥问题,是不是跟咱们这块呢,这种调的方式呢一样吗。啊也是一样的啊,只不过呢,这时候呢要求比较高,而我们此时的这种要求呢,就比较低一些了,第一呢,体现在第一个啊,可能这个权限呢小,那没关系,我们这块一加呢就可以访问了。然后可能说你要没有空单构造器呢,那当然这个位置呢,我们也可以呢,调指定代餐的,所以这种方式就更灵活。OK啊行,这个呢就非常清晰的,我们就把哎,我们通过反射呢,能够做的这三个事儿就说清楚了,通过反射呢,咱们讲这一章大家呢,重点需要关注的是什么内容啊。第一个就是不涉及到代码层面的啊,就是关于我们这个大class的一个理解。
35:01
就是我们上面写的这个文字的部分。啊,这呢是不涉及到文字这个代码部分的啊,涉及到代码部分的话呢,第一个你得需要呢,知道如何去获取大的class的实例,因为你要实例都拿不到的话呢,下边这个事儿呢,都做不了啊诶这个对应的前三种方式大家要会去写啊,诶这个完了以后的话呢,接下来你说需要掌握什么代码呢,第一个。啊,这种方式的话呢,JD8呢,还是常用的JDK9以后呢,就不让这样用了啊,你说这个呢,我们的重要性呢,就降低了,这个降低以后的话呢,其实需要大家关注的就是我们现在写的这个三。调用指定属性、指定方法、指定构造器。有可能以后我们写的呢,相对来说也少一点,但是呢,如果你要看呃,这个框架的源码的时候呢,他就会这样去用。啊,你说我不会去写,到时候我看也能看得懂,估计到时候你要不会写的话,你看的话也会费劲,所以你先确保自己会写。然后你到时候再看的时候呢,会相对来说轻松一点。OK啊诶这呢就是我们要讲的反射,涉及到代码层面的重点内容,需要大家呢能够去练一练的。
我来说两句