00:00
好,我们接着往后说啊,呃,那么我们还是来,呃,说一下我们讲的这个通过构造器的方式来进行这个依赖注入的一个问题,好,什么问题呢?呃,就是我们又加了这样的一个构造器啊,就是我们再加了一个成员变量,然后呢,又给它加上了这样的一个构造镜,看到了吧,诶,又加上了这样一个构造器,然后呢,我们在这个配置文件里面呢,又通过诶第二个构造镜呢,我们又重新配置了一个并对账,好那么最后我们在测试的时候呢,发现了这样的一个问题。发现了一个什么问题呢?哎,就是我们按照第二个构造器来配置的这个病呢,它是没有任何问题的,但是呢,我们原先配置的这个病呢,它出现了一些问题,我们这个45万呢,本来是要给到他的这个price上面的,但是呢,他最终的是付给了这个病,好就是这样的一个问题,这个大家应该都能看懂了吧?好,那么接下来我们就来给大家去解释一下为什么会出现这样一种情况,好那么首先呢,我就要跟大家去说,这个point它是怎么来去确定我要用哪个构造器的呢?
01:09
它是怎么来确定我最终要调用你的哪个构造器啊,啊其实跟我们是一样的,呃,跟你调方法是一样的,比如说哎,对于这两个构造器来讲,它就是一个什么重载的构造器吧,对不对,OK,那么我们在调方法的时候,其实诶你去调方法,单纯的看方法里呢,他可能决定不了你要调用哪个方法,我必须他再去结合上你的参数列表,是不是才能决定出来我最终要调用哪个构造计法,OK,好,那么破它也是这么去做的,首先呢,比如说诶,他在去实例化我们当前的这个病的时候,那么他看了一下,现在我总共有三个参数,而这三个参数呢,分别是字符串类型的,字符串类型的,而以及这个呢,它现在其实也确定不了到底是个啥类型,对吧,因为我们从这个角度来讲,既可以看成是字符串的,也可以看成是一个数字类型的,好所以说呢,它就拿上这个参数呢,到我们的这个卡位项里面,卡位里面去匹。
02:09
配它的构造器啊,那么匹配的时候呢,我们就按照现在这种现象来讲,它首先第一个匹配了构造器,就是这一个能理解吧,他首先找到的是这个过导器,如果说他首先找到的是这个过导器,那就不会出现这个问题了啊,那么一会儿呢,我再来跟大家去说一下,为什么找到的是这个过造器啊,那么当它找到这个过道器以后呢,那我们看一下,第一个是字符串的,第二个也是字符串的,而我们45万这个值呢,虽然说我们本意上是想给到这个price上面的,但是它是不是也满足in推这个类型的,能明白吧?OK,那么你想一想,对于support来讲,他只能根据你数据的类型来去匹配,他知不知道你这个东西是要给到这个价格上面的,他是不知道的,能明白了吧,所以说呢,哎,他先获取到了这个构造器以后,那么他最终呢,就把那个值呢,给到我们的价格。
03:09
上面的,那么同样的道理,我们第二个对象,你看第二个并对象,我们给的这个300呢,我们本意其实就是想给到那个数录上面的啊,正好呢,他在找这个构造器的时候呢,也是先找到了这个构造器,那么就把那个300给到这个速度上面了,能听到这个意思了吧,能明白了吗?OK,好,那么接下来呢,我就来给大家去说一下,那他为什么先找到的是这个构造器啊?这个大家知道为什么吗?啊,我先问大家介样一个问题啊,你说我们在一个类中,我写这个方法也好,或者写这个构造器也好,这个前后顺序有关系吗?没有没有没有啊,感觉上好像是没有是吧?啊而且呃,老师在给大家去讲的时候,应该也说过方法嘛,你写到哪无所谓,你先写谁后写谁无所谓,我调用的时候才会执行嘛,是不是啊,哎,但是大家注意了啊,这个勾造计这个东西吧,它其实跟这个顺序还有那么一点关系啊,有什么关系呢?我告诉你,现在我们在获取这个构造器的时候,它怎么获取啊,它得拿到你这个类中所有的构造器,然后呢,挨个往出迭代,那么首先拿到的就是它。
04:26
为什么拿到了它呢?因为它是最后一个定义的构造器,而在获取的时候先获取这个可能大家不知道哈,一一般也没人闲的去研究这个问题是吧?啊,那我就来给大家去简单的去说一说,然后呢,帮助大家呢去理解一下,呃,那我们回到这个测试类里面啊,我们来写一个测试类测试方法,好test我们的这个,呃,Reflect怎么写来reflect是吧?阿姨,这就是我们这个反射啊,那么它底上可能就要通过反射来去做这个事,那么大家就跟上我来一起来把这个来验证一下,好验证什么东西呢?呃,现在呢,我要拿到我这个卡类里面所有的构造器,怎么获取,首先你得获取到一个什么呀。
05:16
Class别相法是不是啊,那就等于什么呀,卡点class是别三法对不对,然后呢,接下来我们获取它里面所有的构造器,怎么获取啊,CS get什么declare的constructor是吧?是不是拿到这个所有的构造器啊,对吧?那么它返回的是一个construct的一个数组啊啊,我们就花花一点时间啊把这个呢给大家去说一下。来吧,我们就拿到了这样的一个数数,拿到这个数数以后呢,接下来我们就来进行一个迭代啊for,我们来迭代这个constructor啊,那这个就写的是啊con啊,那么我们怎么知道它是哪个构造器呢?我就把这个每一构造器的这个参数列表给它打印出来,我是不是能确定我现在拿到的是哪一个了,对吧?好,那这个怎么打印它的参数列表啊。
06:06
你是不是还得获取到这个get什么呀?是不是有一个叫做排S啊,看到了吧,这是获取我的这个参数列表啊,然后呢,这个拿到的就是一个class啊看一下啊,他拿到的是一个什么呀,Get的下子这个方法返回什么样,返回一个什么class数组吧,OK,来class数组啊,就是times吧,好,那我们还得再去做一个迭代,迭代什么呀,迭代到每一个class嘛,是吧?然后呢,我们在输出的时候呢,CO我们就不要换行了,你就直接输出什么呀c.get什么呀,Name是不行了,这是不是获取到它的每一个类行了,然后呢,呃,我们在这个后面呢,加上一个呃逗号啊好,每一次迭代完成以后呢,我们再给它来一个换行是不是行了,好那么现在我们就来看一下,我通过反射的方式,我来获取你的构造器,你来看一下先获取到的是谁,是不是A。
07:06
一这的再获取到的是大火吧,诶,其实这个地方还偷偷的藏了一个,你看到没有对吧?你看我鼠标能点到这说明这个地方也是有一个的,只不过没打印出来吗?这就是我们那个无参数构造器嘛,对吧,因为它是没有这个参数的,所以说这个地方打印不出来嘛,啊那么从这个角度我们就能看到它首先迭代出来就是这个构造器,那么我拿上我那个具体的那个三个值来去匹配的话,你看字符串,字符串,然后45万往这一放满满足吗?满足,300往这一放满足吗?也满足,所以说呢,他就直接使用这个构导器了,就不再往下去找这个构导器了。能听明白吧,OK,好,那么接下来我给大家来去说一下,假如说我在我当前这个类中,你注意了啊,你注意了啊,有一个什么现象呢?我把除了构造器之外所的方法都掉,看到了吧,我把除了构造器之外所有的方法都拿掉,好现在我再来给你做一个测试。
08:04
找一下发生了什么现象,调过来了吧,再获取的是无参数的,再获取的是大火的,再获取的是in,看到了吗?所以说呢,他其实跟你书写的那个顺序呢,还是有一些关系的。明白这个意思了吧,但为什么你加上别的方法以后,它就倒过来了,你不加这个别的方法以后,它就是一个正的呢?啊,其实这个问题你要再研究,那就得学C语言了啊,这东西就太深了,理解吧,因为我们知道哈,就是本身,呃,Java呢,它是建于基,基于什么呀,是基于我们这个JVM来去运行的吧,对不对,但是呢,最底层,如果你如果跟我们这个操作系统大交道啊,它就是根据我们什么原生的这个代码,大家有时候调方法,你就比如说你去走原代码的时候,走着走着发现有个方法是native的,你就没办法再往里面走了,对吧,那其实就是走到你这个原生的那个代码里面了,就是那个C语言里面了。
09:02
啊,那么你就可以去研究一下C语言,就能知道为什么是这个样子的,其实在这一个最底层,我可以再跟大家说一下啊,在这个最底层就是它是怎么来帮我们去操作这个方法跟这个构造器的呢?他把这两个东西都当成一个方法来对待,在Java里面我们才有构造器这个概念,但是呢,把构造器跟这个方法构造那个C里面,他认为这两个东西都是一个方法,所以说呢,你加上方法以后呢,诶,对我们这个当前类中的这个构造剂啊,以及这个普通的方法,他把这两个东西呢,放到一起来去考虑,那么他来帮你去保存这些对象的时候呢,在你那个所保存的那个,呃,我们假设它是一个数组,好吧,在那个数组里面,它就会什么有一个顺序的变化了。明白吧,啊,就会有一个顺序的变化啊,所以说呢,这个东西的话,大家怎么简单的了解一下就可以了啊,这个东西就很底层了,所以说呢,现在你们要知道的是什么,我们正常情况下,像这个概率算的方法,那肯定是得有的,对不对,像这种情况下,大家注意它构造器获取的时候呢,就是根据你啊书写的这个构造器的一个什么。
10:07
倒叙来获取的,先获取的是它,再获取的是它,再获取的是它,明白了吧,那么其实这个顺序你也不用去记,但是呢,大家一定要理解的就是为什么现在它统一都是使用的这个构造器,现在能明白了吗?明白了吧,啊,你要在乎明白。我们就来讲讲C语言是吧,那明白了吗?明白了吧?啊,开玩笑我也不会,我就么跟你讲是吧?嗯,OK了啊啊,那这就是我们的呃,这个问题啊,那你说有了这个问题了,我们应该怎么解决呢?啊,大家这个应该都看到这里面了哈,我们其实呢,除了这个in单词之外呢,我们还有一个tap啊,有一个tap这样的一个属性啊,那么其实这个tap呢,就是来指定一下你当前的这个值,他要给到什么类型的参数上面,那比方说呢,对于这个我就严格要求你必须要给到一个什么呀,呃,Java点烂点什么呀,大火你必须要给到这个大火类型上,那么现在我们再来就是做一个测试,大家来看这个效果。
11:14
你看还有问题吗?是不是给到这个大火上面了,对不对,哎,所以说呢,大家注意啊,就是啊,使使用我们这个各大器这种方式来进行依赖注入的时候呢,我们要知道的就是两个属性,一个是index,一个是tap index呢是指定参数的位置啊,Tap呢就是来指定我们参数的什么呀,哎,参数的类型啊,指定参数的类型,听明白了吧?啊,指定我们参数的类型啊,所以说呢,绕了这大半天呢,主要就是想跟大家去要说这样的一个什么设置。听明白了吧,啊,那么大家以后再去使用这个构造技的这种方式来进行依赖注入的时候呢,你一定要注意他有时候就会有这种歧义啊,知道这个歧义吧,啊,这个歧这个歧义是吧,是不是这个棋啊,啊歧义是吧,就用这个歧义了啊,那么我们就必须要通过什么呀,通过index或者是这个太来去给他什么做一个具体的指令,听明白了吧,OK啊,那这个问题呢,我们就给大家讲到这啊。
我来说两句