00:00
好,那接下来的话,我们就以这个命名参数啊,这个为例呢,给大家去分析一下,它底层对这个参数传递的一个啊。源码分析,然后懂吧,就是我们要深入到它底层看一看它到底是怎么处理的,能听懂了吗?OK,来吧,我们就来看啊好,首先的话,我们先确保一下我从什么地方开始进去是吧?啊,那这个是我们的。Map的啊,这个我们就注释掉了,呃,命名参数的话是不是这个方法呀,你看一下啊,现在我这个get employ by ID这个东西,大家来看一下它是不是已经加上这个命运参数了,对吧?OK,好,那我就以它为例啊,注意那么现在的话呢,我就希望深入到它的底层,那我就可以在这个位置给它加上一个断点了吧,对不对,那我就看一下你在调这个方法的时候,底层怎么处理的好,所以说加上断点我们直接右键run as有一个debug as,注意啊,一定是debug as,来走一下好吗?来停到我们这个断点里面了,大家来看诶。
01:12
等了半天是吧,看一下吧,是不是段姐来到这个位置了,OK,那么接下来我要问大家一个问题,我怎么进去它这个方法的调用啊?F5是不是,哎,注意哈,好多同学想说,那你鼠标点进去不就行了吗?注意你点不进去,因为这个东西是个接口吧,对吧,而我们这里用的那个是一个代理实现类,你想的啊,代理实现类那可不是提前写好的对吧,是运行的时候生成的吧,所以这个问这个东西我们没有办法怎么着啊,提前点进去啊,所以说我们这个位置直接怎么做呀?诶F5进入到它方法的一个调用啊来,所以说呢,怎么点到这个地方有一个step into啊F5进来,进来以后的话注意了啊,首先我们看到一个叫做什么value of,你看到没有。
02:01
Inte类型,其实我们来到了这个inte的class,为什么呢?因为买be呢,他会把你这个传了这个值,你是传了一个这个1024啊,他要把这个值呢,给你做一个处理,所以说这个还不是我们想看的那个东西,那我就直接来step return,让他结束这个方法的调用,你看这个处理就完成了,是不是又回到这个地方了,来再step in into好吗?现在我们就来到我们想看的地方了,注意直接来到了一个什么方法呀,Work,还记不记得这个方法呀,记得吧,什么时候执行引问方法来着,代理对象调用代理方法的时候,是不是要进入到引里面呀?那你现在就来分析吗?现在满不满,不满不满足这种情情况,代理对象是不是他呀,这个方法是不是一个代理方法呀?OK,代理对象调用代理方法,那么你就要进入到我的in work里面是不是啊,而这个work是谁里面的呀,Invoc handle了对吧?OK,那我们就来看当前我在mappro这个类中啊。
03:02
那我往上翻,我们会发现这个micropro它确实是实现了这个接口的,嗯,那这里面有一个引用和方法就不奇怪了吧,对不对,好来吧,那我们回到这,我们来分析一下啊,大概的过一下啊,首先呢,他判断一下当前的这个方法呢,他在哪个里面声明的,你看获取了一下这个declare,这个class,如果说你这个方法是在object里面声明的,那么他就直接就走了,你看到没有。看到了吧,因为哦不价值的,我需要代理吗?我代理你干嘛呀,是吧,所以说这个地方不执行,那么直接就往下走,那么他代码应该要来到这个位置,你看到代码往下走一行,是不是来到这了,看到了吧,来到这,来到这以后呢,他拿到一个这个map method啊,这个东西是谁呢?你注意了哈,这个method现在其实我们已经知道了,它就是我们的调用的这个方法,你看到没有,是不是正在调用的这个方法呀,这就是我们的这个method,它要通过这个方法呢,给它混弄成一个叫做map method这个方法,再通过我们的map method去做一个具体的执行。
04:05
理解这个意思吗?好,说说你看了哈,来带码往下走啊,往下走一哈,那么这个map method我们就获取到了,看一下它就是一个map method的对象,而这个对象里面有一个command,大家注意这个command的name呢,就是我们的全类名,加上你的方法名,看到没有?其实你也可以把它当成什么呀,当成烧烤语句的一个唯一标识嘛。对吧,我首先是确保你现在调的那个方法是什么理解了吗?然后呢,还有一个这个so command tap,大家注意啊,这个是比较关键的,一会我们会用到so command tap,它是一个select类型的,看到没有,就是现在我调用的这个查询是select还是update,还是delete,还是insert,是不是一个查询啊,OK,好,这是关键的啊,再来看还有什么关键的东西啊。这个method里面的话呢,我们看看啊,这里面诶有一个return ta看到没有,这是我们的返回值类型吧,对吧,其实它就相当于通过你当前所调用的这个方法呢,我要收集到与你这个方法相关的一些信息,然后呢,接着我就要进行后续的处理了。好,接下来我们往后看,它要调用到icq的这个方法里面,那我们就直接step into,假如说你知道他要执行到什么地方,那你可以直接点进去,去打断点,让它停住,如果你不知道,那你就老老实实的step into进去,进来以后我们能看到啊。
05:29
他首先通过这个command获取一个get tap对不对,刚刚看过那个get tap啊,那个tap是什么类型的select,好,那你看一下他判断insert update delete select,那肯定来这嘛,对吧,说是断点直接放行吧,来到这就行了,但是来到这以后,你发现这代码也挺多的,它执行哪个呀,我们可以分析一下,你看啊,在每个里面呢,都有一行代码叫做什么呀,Convert what as to so command para。
06:00
啥意思,将参数转换成circle语句的para吧,对吧,所以说你看每个里面都有这个方法,那说明这个方法是必须要执行的,那我就来到select里面去看一下,是在这个位置有啊,那其实我就能断定他肯定要执行else上面的这一对不会执行的。能理解吗?这是我的一个分析啊,我的一个判断,那如果说你打不准的话怎么办呀,那你就一行一行走呗,你看走一下进去了吗?再走进去了吗?再走进去了吗?再走,诶,进来了吧,是来到这儿了,OK,好,那么大家注意这一行代码就是我们要看的那个核心的代码,它要什么呀?将二转换成我们的搜口语句的一个参数行吧,注意这个二呢,就是我们呃传递给那个方法的两个参数,还记得吧,对吧,这个东西一直在往后传的啊,然后这个method,就是我们刚才的那个什么map method看到了吧?好,来接着往后走,好,它要掉进去,那我们就step into OK,来到这个位置,好,它这里面有一个内S,就是什么呀,参数名字的一个解析器吧,他去帮我们去,诶得到这个就是把你的这个参数呢,传到这个方法中,最终呢,是不是得到一个这个我们最后处理完的那。
07:24
那个呃,那个参数吧,对不对,所以说我们具体要看的是这个方法哈,那我们接下来只能再接着step into进来,好,就来到我们的这个方法了,这个方法就是我们最终要去看的那个方法,行,我先把这个地方的加上个断点吧,好吧,加上断电,我们挨个来走一下啊,你看这个二还是我们传的那个参数,没问题吧,能看懂吗?OK,再来往下看,首先第一行呢,他说内角size,这是什么意思啊,获取了一个内的长度吧,对不对,这个names我们一看,这应该是一个map,然后一一看发现哟,这里面怎么有个值啊。
08:01
看到没有,这里面是有值的呀,对吧,那我得分析一下你的值是哪来的了。对不对?好,那我们来分析看names在哪初始化的啊,大家注意names,我们来点一下names找,发现它就是一个sorted map,看到没有,就在当前那里面的啊骚,Map,好,那我去找他在什么地方初始化的。在这个位置初始化的,看到没有,那在这个位置初始化的,而且呢,它是通过一个map来初始化的吧,那我就要去看这个map,我们一看,诶map从这个地方往里面put过数据,那行吧,我就定位到了,我应该要去分析这个循环了。好,那我们来分析这个循环,它其实已经执行完了啊,所以说我们只能手动的来去分析一下吧,大家来看它首先呢,做了一个循环,看到了吧,哎,做了一个循环,然后呢,从零开始拿到这个para count,是不是我参数的个数统计啊,对不对,然后呢,注意这个肯定是不知情的,直接往下走,他这个地方做了什么事呢?我拿到所有的参数里面的注解,看到没有,是不是啊,然后呢,获取到每个注解,我判断一下你的注解是不是属于pma类型的,现在我们的注解是不是这个类型啊,是是的,好,那么我们有注解吗?有,而且注解是不是就这个类型的呀,它就把一个值,你看叫做什么has para a notation就改成true了,那么原本这个值应该是一个什么false嘛,你看一下是不是啊,就没有值吗?原本没有值,那默认不就false吗?对不对,OK啊,它改成改成true了,改成。
09:39
最后呢,顺带的又从什么呀,Pyma的value是什么意思啊,是不是获取到我们给他传递的这个pyma,这里面的这个值是不是就是value值啊,对吧?OK,好,他拿到这个Y6以后,然后呢,诶这个if就break break了,那break break以后呢,是跳出这个循环吧,那接着往下走,拿到了这个name干嘛呢?你看等于空吗?
10:01
不等于等于空吗?不等于,那接着往下走,是不是走到了这个位置了,他就把什么呀,把我们获取到了name put到这个map中了吧?好,Put的时候用的K是什么呀?用的是parama index,而这个值一开始是等于零嘛,嗯,对不对,所以说呢,我们就能分析到了,其实这个map等它这个循环结束以后,里面放的是什么东西啊,放的就是零对应的是一个ID,然后呢,一对应的是不是一个last name呀,对吧?OK,好,他再把这个东西呢,给你啊,重新放到了这个names里面,所以说我们现在看到了这个names里面就是我们刚刚分析的零等于ID,一等于拉内,看明白了吗?OK,好,那么这个X就是我们的1024,哎,以及我们的一个超导数是吧?OK,好,那么接下来我们就来往后分析。R等于空吗?不等于行,这个不用看了,这个这个中解我们刚刚这个值刚刚看到是不是改成处了,处一飞是不是false了,放以后并且的关系,这个也不用看了,好,那只能看else了吧,对不对啊来吧,分析else,那么在这个分析else的时候呢,大家需要注意哈,分析这个else呢,我们需要记清楚几个数据啊,就是X里面我们放的是什么呀。
11:23
放的是1024,然后呢,张老师是吧,诶好,这是我们放的数据,然后呢,这个内斯里面放的是什么呀。放的是什么呀?零对应的是什么ID1对应的是last name吧,我就写个LV,能看懂吗?行吧,来吧分析,首先呢,他帮我们创建了一个map,然后呢,从names里面呢,获取到ENT site是不是获取到每一个ENT啊,对不对?然后呢,注意了啊,我要往这个map中去put数据了,Put的时候K用的是N垂点get value,那么这个N垂点get value是不是ID啊好,那行,那我们新的map里面放的是什么数据呢?来第一个它的K放的就是ID,能明白吗?好,那么VALUE6放的是什么呢?N垂点get k获取到的是不是零啊,再拿上零到X这个数组中获取来零到这里面获取到的是1024行ID等于1024,这个我是不是放到这个map中了?那同样的道理,再循环一次,Last name等于什么呀?
12:38
啊,等于张老师是不是放到这个位置了,能分析明白了吗?行,那么这是我们暂时能分析到的,好,那么再来往下看,它这个位置有一个generate name perfect,就是一个自动名字的一个什么前缀吧,其实它就是一个para,然后呢,String value of I加1I一开始是零吧,第一次这个就是一吧,那听起来其实就是一个拍一,你看到没有?
13:05
能理解吧,拼起来就是一个帕一,那再I再加上一次,你看这个是I,下面是有个加加操作呀,I要加一次,那就不变成PM2了,对不对,那做什么事呢?你看了啊,para.put加names,这不就是它吗?第一次不就是PARA1吗?把PARA1你看ask n get k是又是1024啊,所以说呢,他就把P1等于1024,是不是也放到这个map中了,同样的道理,P2等于什么呀?超老师是不是也放到这个map中了?好,因此这是我们最后分析出来的结果,那我们让代码直接来到这个他这个位置,好断电往后走,我们来看它里面数据跟我们分析的一样,不一样,嗯,注意啊,来看一下。ID1024PART11024,然后呢,Last name常老师拍二常老师有出入吗?没有行,那这个拿到以后呢,我们这个就执行完了,执行完以后我们就会以让它step return好return到了这个位置,那么这个参数呢,再step return是不是又回到我们的这个位置了,能看到吧,那我就拿到了你的这个参数,拿到了这个诶P们你看好了哈,现在还没值,往下走一行,是不是就是我们这个值了,拿到这个值以后呢?接下来大家注意了,So session登场了。
14:25
他掉了一个select one方法,是不是我们第一个hello word里面讲过的,对吧,他掉了这个方法做什么事呢?哎,把你的command点干的内还记不记是什么。Command里面的name,我说那个name就是全类名加上方法名嘛,你也可以认为就是so语句的唯一标识吧,那你看是不是在这个方法中传了个唯一标识,传了个参数进去啊,好,那么后续的操作我们就不用再去看了。对吧,Map都给你传到这了,那你想一下,他将来找到我的这个方法,再找到你map里面的那个参数,你在这个搜口语句里面怎么取的,是不是到这个map里面去取对应的那个KR啊,对应的那个V吧,那取到以后我调用一个查询,不就查回来一条数据了啊,明白了吗?所以说它底层就是这么来处理的啊,那么这就我们就分析完了,那么分析完了以后呢,我们来再来看一下这个位置啊,我已经把关键系的那两个代码呢,给大家截到这个位置了,就是我们这个源码分析下去以后,大家自己把这个源代码呢,给它分析一遍,明白了吧,那么啊,你可以按照我的这种方式,就是代码一行一行的去执行这种方式来分析,或者说你就干脆直接把这些代码看懂就行了,那么你要看这些代码的话呢,我们就得有一个前提了。
15:49
对吧?啊,有个什么前提呢?注意啊,什么前提呢,就是二里面我们放的它是一个数组吧,二里面我们放的有个数据1024什么啊,直接写到这吧,好吧,哎,有个这样的数据,然后呢,Name里面我们它是一个map map里面就是什么零等于ID,然后呢,一等于拉内是不是这个值啊OK,那么你就以这个数据来去分析它,最终你要得到我们的这个paramo它的这个结果。
16:24
能听懂了吧,这是你们今天下去以后必须要去做的事,你只有把这个好好的去分析一遍,那么你才能把这个参数的处理给他记住。听明白了吧,难吗?这个东西啊,不难,这个源码是最容易看的懂的了,比你之前买这个smartc里面看的这个简单的不能再简单了,对吧,起码这个一看啊,就是几个基本的循环,这就是人写的是吧?啊,你前面那个都是牛人写的啊,当然这个也是牛人写的是吧?啊,但是这个我们是能看得懂的啊,行吧,那我就给大家说到这儿啊。
我来说两句