00:00
各位大家好,下面呢,咱们继续来完成手写瑞实现LC功能,下面咱就把这个包扫描过程用反射进行实例化,这个方法最终给他完成,那咱们最后来写下这个代码,按照步骤咱们一步步来看一下,首先我们看第一步判断当前的file是否是个文件夹,那我加上一个if,咱们来判断一下,这个判断怎么做呢?在里边有个方法叫is director,如果这个它表示代表就是文件夹,如果它里边是false,那就不是文件夹,目前我这包肯定是文件夹,所以在在里边进行操作。这是第一个,加上一个if判断,然后把步骤放到里面来,咱们继续来写。小D,位置咱们继续来看啊,如果说它是文件夹,那我们怎么做?咱们按照第二步获取文件夹中的所有文件,用file中有个方法,这方法各位要记住啊,叫list的,这个叫files,它是得到里边的所有内容,包括里边的文件,包括里边的文件夹,然后这个我给它起个名字,呃,咱就不叫files,比如我叫这个。
01:16
Child。Files啊,叫他了啊,Child fails。或者叫childrens啊。这是我们得到里边的所有的内容,然后大家看是一个数组形式,然后得到之后第三步咱做过判断,判断里面内容是否等于空,如果等于空,咱就直接返回,表示里边没有东西,然后咱给他做个判断,把判断写的更延个点。我来写一下啊,就是children fails,如果说他等于呢,呃,再来个或者如果说他的LS。等于零,那表示里边是没有内容,咱就直接做个蕊退,表示返回,因为它里边没有东西,如果里边有内容,那我们继续往下看,就是便历里边所有内容,给它做一个便历,所下面我们写第四步啊,所以大家注意啊,你看我这个代码写的过程,我首先先把步骤给它先写出来,把步骤先给它整理清楚,然后往里边一步一步是不是填入代码,你看我刚才填了第一步,第二步,第三步就是依次给他填进去的,只是填代码中可能有一些细节过程,但是主要的流程刚才应该咱们都做了分析。
02:33
那咱们继续来写,下面写第四步,把这个数组咱们进行遍历,那我来遍历一下啊,遍历的话呢,多种方式啊,咱就写一个这个增强负循环便利了,因为每部是一个file,咱就叫这个child。这个叫childrens,便利得到里边的每个对象,我把这个啊,咱给它都拿过来,因为在里边我们要做这个事情。
03:01
在这里边要实现。咱们继续来写啊,就是便利得到每个file对象就是这个child,然后咱们这里边继续判断,如果说啊,它还是文件夹,那咱就递归,就是还是调这个load的B方法,继续进行递归,做这个过程,那我们来写一下啊,加上if。就是里边这个child,如果说我在。com还有夹,那我继续进行便历,这里就用到这个叫递归的方式,咱们调这个叫load BI。加上一个child,注意不要传错啊,如果他不是,那就往下执行这个注意一定不要传错,别传别的啊,可能会造成别的问题,咱传的是这个便利之后这个child。这表示它还是文件夹,然后再加else,如果说它不是文件夹,那它肯定就是一个文件,那咱往下来做,咱们这里加上一个else,继续来写代码。
04:06
我们继续来看啊,在else里边,这里写到便利得到file,如果不是文件夹,那肯定就是文件啊,就是目前在else里面的child就是一个文件,如果是文件的话,那咱怎么做得到它的包路径加上类名称的部分,这过程咱就做一个字符串的截取,那怎么做给大家写一下啊,用child里边。有一个方法get pass。啊,这get个个法叫做过截取,怎么截取,就是它那个包的这部分,因为咱们刚才代码中是不是一个叫root pass是你包前面部分,所以把它直接截就可以,我这写一下。Root pass.les减一,把这个直接给它取掉,这样的话得到就是咱们那个包开的部分,把这个得到,我给它起个名字啊,就叫这个。
05:13
Pass。呃,就叫pass这个网啊,包我看一下我的课件中叫什么,跟他我就保持一致了啊,我课件中叫这个pass with啊,我也叫他了啊,就叫这个名字。所以现在这部分咱就完成了,我再重复一遍啊,这部分做的什么意思?我们现在如果说便利内容得到是个文件,如果是文件的话,咱就把的分得到,就是咱们从。com硅谷后面加上这个类的这部分给完整得到,那怎么做,做个取,把包前面部分给它截取掉,用咱刚才那个root pass进行截取,最终得到一个pass with,这就可以了,这是我们的4.3步。然后之后我们再看4.4,现在肯定是个文件,但是文件呢,可能有很多种类型,咱最终创建对象的文件肯定是一个自解码文件,就是咱说的文件,那我下面继续来判断。
06:13
我这里写一下啊,就看它是否是一个自解码文件。看怎么做啊,用pass class里面一个方法叫contents,然后里面加上一个叫点class。就是如果说啊,它里面包含这点class,那证明就是一个cos文件,如果是cos文件,那咱就往后继续来做。咱们继续来看啊,这是我们写的4.4部。所以各位啊,就是一步一步要跟上这个过程啊。我再把这过程再重复一遍啊,就首先按照我刚才写到的第一步,判断当前是否是个文件夹,如果说不是文件夹,咱就不需要做了,因为你的包肯定是文件夹,如果是文件夹,咱们得到里面所有内容,然后判断,如果里面有内容,那咱便利得到每个file,然后file,如果文件夹继续遍历,如果是文件,得到包的部分,然后判断是否是class d文件,如果是的话,那咱们开始做4.5步。
07:16
我们来做一下啊,4.5做什么呢?这里写的很明确,因为你目前得到的应该是一个是一个径啊,就那个带斜杠,包括带你的后缀名部分,所以咱怎么做把里面的斜杠。变成点,把点给它去掉就可以了。那咱来写一下啊。Pass with class点上,把里面那个斜杠。给它替换成这个点。然后把里边的那个就是啊,写一个replace可以了啊,把里边那个就是。给他最终去掉。
08:00
这样的话,得到就是咱们最终要的这个结果啊,这个我起个名字,我就叫这个ona。就是完整这个名字啊。然后咱们得到这个完整路径之后,我们继续往下写,下面呢,判断类上面是不是有这个B的注解,大家写的更严格点啊,因为咱们实际中得到卡兹这边文件,这个文件可能是一个类,是不是也可能是一个接口interface。看是不可能是它,而inter非上面它肯定不将这个艾滋病注解,所以咱判断如果说它这里边不是这个接口,咱们财经实例化是接口,其实咱就不需要了啊,那这里边我写一下啊,就是判断是否它是一个接口,如果不是接口,咱们才继续进行。我写下。呃,这个过程中我们看怎么来做啊,因为现在呢,在这里边我们得到了全路径,得到全路径之后,我这步骤咱写的比较概括,咱写的更细致点啊到这里。
09:03
我叫这个4.6.1啊,写的更细致点啊,点6.1,因为现在得到了类的全路径,所以咱们获取一下类的这个这个对象。把这个得到。然后得到之后写一下4.6.2,咱们判断如果说它不是这个接口,就是interface,咱们进行这个实例。啊,就是做这个事情,那咱们来做一下啊,首先我们用class.forna加上它的ona,就是完整的路径,这个得到的就是一个class,这个对象咱们起个名字叫A。这个我们就得到。啊,这个得到,因为做反射嘛,这个类对象肯定要得到,然后这里边有异常啊,咱们把异常给它处理一下啊,加上一个try catch处理一下,我就给它直接就。
10:05
啊,写到这里啊也给他。肉出去了啊,然后后面掉,等待里边再拆开给它处理。直接出去了啊,讲这里,然后咱们来看啊,现在把这得到之后,那我们判断它如果不是一个接口怎么做呢?用class里边有一个方法,这个方法我们来看一下叫什么啊,这个方法我们写一下应该叫is interface啊,这表示它是个接口,如果不是个接口,咱加感叹号非表示它不是接口。如果不是接口的话,那在下边就是刚才说的这个部分,判断上面是否有注解。我们写一下就是4.6.3。这个有注解,然后再写一个这个4.6.4啊,进行实例化。
11:00
这个咱先写三过程啊,判断有没有注解,那怎么判断呢?我们用这个Z里一个方法叫get notation,加上你注解的class,咱们解是不是这个b.class。把这个家长大家注意啊,这不要写错,我刚才注解是不是这个啊,当然你可以叫别的名字,我就叫个B,所以判断是否有这个注解,然后它会返回一个对象,这个对象给它起个名字,我就叫这个。啊,比如咱们给他啊,直接强转成就变成这个B,因为它就是这个B啊。就是它啊,这个我们名字我们就叫这个啊,就是它。啊,这里边报了一个错啊,应看这位置,咱给它加上一个泛型啊,未知的泛型,现在得这个注解,然后咱判断就是上面是不是有注解,我们来直接判断一下啊,加上一个if。
12:01
如果说这里边的annotation这个对象它不等于空,那就表示类上边有这个注解,如果有注解的话,我们继续来写,就是4.6.4这步骤,咱就把这个对象或者这个B进行实例化。啊,注意啊,终于到了实例化过程啊,咱就进行实例化,那我们用在az里面的方法叫get be declare contractor,或者直接加上一个contractor。然后里面这个方法叫做new instance进行实例化,然后最终返回到就是我们这个对象啊,咱就一个object给它起个名字,我就叫这个intense,就是实例化的对象,所以到这个步骤,咱们把这对象可以说就完成了最终的实例化,这ten就是实例化之后这个对象。所你看啊,通过这个步骤,这些判断,最终终于到这个过程,然后实例化之后,注意啊,他还没有写完,还有最后一步,有同学说老师怎么这么多步骤,没办法,但要把一个成语写的完整,必须写这么多步骤,但是其实我们写的还不是特别完整,只能说实现一个最基础功在此文的底层,它比我们考虑的肯定更加的周全,但是为了模拟场景,所以写了这么一个过程。
13:20
然后咱们继续来看啊,最后一步是什么呢?要把你实例化的对象放到一个map机构中去,往这里面放一个对象。那咱给他来看一下啊,这个map集合呢,咱们最开始创建过了,在这里叫这个b factory这个对象,所以咱们像map集合里边放这个,最终这个对象我们给它放就可以了,但是放的时候呢,这里边我们做一个简单的处理,如果说啊,我当前这个类它有接口,然后它的接口的class作为,如果没有接口就是自己的作为,所以最终在里边我们再做一个简单的判断。
14:01
就是4.7.1写一下啊判断。就是当前这个类,如果说有接口,我们就让它的接口的作为map的key。如果没有接口,那自己卡就作为他的key,那咱们最终做个判断,就最后一个判断了啊,写一下最后一步骤。我们加上if,然后加上这个在这az get,这个叫interface啊,咱就来一个L,如果它的LS呢,大于零表示有接口,如果它等于零,那表示没有接口,有接口的话,让接口的class作为map集合的这个key。那我们最终写一下啊b factory。找到啊。Factory找到那个最上面这个。为了我们后面能用到啊,各位注意,这里边我们给他。
15:04
写上啊,然后再下面给套用一下啊。这里边啊,我们都定义过了啊,那咱直接复制一下给它快速给它最终用一下啊,找到这里,首先这里边如果说有接口,那b factory往中放数据各位应该都会啊,是不是用put方法,然后它的key用它接口中的部分往里边放那种啊,咱往里边给他放下。呃,这里边啊,说是一个静态感给的,就变成这个。静态的啊,为了咱们操作方便。写一下啊。因为我这个方法你注意啊,我这方法为了测试给它改一下,其实不需要啊,咱为了一会儿测试先这么写,一会咱再改啊,然后用put put里边的加上它的key的face组。
16:01
第一个吧,就加个零啊,把这个加上,然后加上之后我们再。加上第二个参数,那就是我们这个实例化的对象instance,现在把这个就放进去了,然后这里边如果说它没有接口,那我们继续来画,还是用这个B。点上的方法,它的就是当前这个,就是咱们那个。然后它的value就是instance这个实例化对象,所以咱们到这里把这个过程我们就最终完成了,咱就完成了里边这个。实现IOC的过程。这个过程呢,完成之后,最后把这个过程给各位再总结一遍,然后最终我们进行测试,那这里边其实这里边可以不写cid,咱给它去掉啊,然后把这方法上给它再还原回来,还是改成我们最开始这个构造这个方法。
17:04
给他改一下,然后这里边也可以改成不能方法。你看现在应该就没有问题了,所以现在啊,这个我们就完成了,那咱们把流程再总结一遍,然后最终我们再完成最后的这个测试。这个也去掉了啊,咱们总结一遍。那我们看一下啊,我们的过程就是咱就重点看这个啊,在这个实现类的里边,第一个方法返回我们的对象,然后你看这对象是不是从中根据K给他取到,然后这里边设置它的包的怎么规则,咱们通过有造包的路径,最终反应对象,那怎么做的呢?首先第一步操作,因为我传的路径是com.a硅谷点什么什么这个内容,所以咱们把点换成斜杠。换成现象之后,得到包的绝对路径,然后得到绝对路径之后根据绝对路径咱进行扫描设置,那怎么做,我这里把每步应该写的很详细了,那我们看一下啊,第一步操作,先判断当前是否是文件夹,如果是文件夹得到里面的所有内容,然后得到所有内容之后判断是否为空。
18:16
不为空,把这个内容进行遍历,得到每个file对象,如果得到file对象还是文件夹,那我们继续进行这个。操作就是做这个递归。如果是文件,那咱得到文件里面这个包,加上类的这个部分,然后这里边判断文件是否是class文件,如果是class码文件,咱把这个斜杠变成点,并且把这个给去掉,然后最终得到这个类的class这个对象,因为咱反射都要用到它,然后得到之后再进行判断,如果当前文件不是个接口,那咱们肯定是个类,咱在类上面看上边有没有这个B的这个注解,如果说有的话不等于空,就是有把这个对象进行实例化。
19:06
实例化之后,把对象放到map机构中,咱们做了一个判断,如果说类有接口,让接口作为这个T,没有接口,自己的class就是它的key。所以以上啊,咱们就完成这个IOC功能的一个实现,这个咱们就讲这里。然后这个写完之后,最终呢,咱们把这效果做个测试,试一下它最终结果怎么样啊,那我们来做个测试啊,咱们看怎么来试。这些我就能关掉啊,然后注意我们的用法,首先我们这么来做,咱先来到service里边,在service的类上边加个注解,我们叫B。然后在do的实验类上面加个注解,不是这个注解,咱们叫at b,注意别选错啊,是咱们这个at b,然后在里边为了测试,我在do里边我们先定义一个方法,这个就随便写一个A的方法。
20:07
实现类中把这方法我们做一个输出,为了一会儿验证进行测试。咱们给他输出一下。我就叫这个DOA的就叫do了啊这个输出。然后之后呢,我们在service的接口中也来定义一个方法,也叫。实现类中把方法最终我们做一个实现。这个方法我们叫。Service,然后咱们在service里边根据注的对象去调用。DAO里边的方法。我们来做这个操作啊,但是这个注入因为咱没有写到啊,咱先做一个基本的实现,后面咱再把这个Di再完成,目前应该只做这个B的这个东西啊,这还没有写到,咱是说了一个意思,目前先试一下对象能不能创建,咱就把这个先做个输出。
21:04
那这个完成之后,下面呢,咱们来做一个最终测试,我在里边呢,建一个测试类,咱给他最终来试一下这个效果啊,咱们来测试一下啊。这个类我就叫test。忧伤。把它创建,创建之后呢,里边加上一个main方法,然后咱们来写一下啊,第一部分用application contest,注意啊,别导错包是咱们自己这个接口。我叫cont,等于上一个叫not applicationt,注意这个也是我们自己这个no com写。那咱们把这个写一下啊,Com点。
22:02
写contact这个对象啊把,或者得到Du对象也可以,我们就得到一个user对象,用它做个测试。然后我在里边写上一个user service,点注意这个写法中啊有一个细节,刚才咱们讲到了,我们向map中的时候,如果有接口,接口class就是做为,没有接口就是自己作为,请问现在是接口,所以写一个user.class最终返回的是一个user class,就是user service啊这个对象。这是我们做的一个返回,然后这里边给它做一个。转你它默认返回的是一个object类型,然后之后我们可以调下里面的方法做个测试,因为里边有一个A的方法,所以以上咱就把这个测试就完成了,注意你写的时候别导错包,这两个都是咱们目前自己写的接口,还有类,包括这里边加上你的接口类型的class。
23:10
这个我们就完成,完成之后最终我们来做一个测试,试一下最后的结果是怎么样的。啊,那这里边呢,啊,为了明确啊,我再做一个输出了啊,再输出一个值,咱们把这个user service也给它输出一下。看一下这个对象啊,然后这里边最后我进行测试,也就是啊,咱们写了这么多代码,最后的激动人心的时刻到来了啊,大家期待已久的时刻,咱们来试一下这个结果,看它是怎么样的啊。我们来看到大家看第一个对象是不是创建了,输入了对象地址,然后第二个serve的方法是不是进行了执行或者进行了调用,最终他也输入这个内容,所以证明咱们用这个艾特B就完成对象创建,但是基于反射加注解实现了LC里边那个B创建的功能。
24:02
所以大家重点啊,把这个流程给自己好好去看一看,就是刚才我们写的这个。包扫描过程,这代码主要用到的就是文件的相关操作,包括反射的过程,这各位给他要特别清楚,这个代码我是一步一步用编写的,所以各位把这代码好好去熟悉熟悉。这个我们先讲到这里。
我来说两句