JSPatch观后感

覆盖函数

1一开始把js调用代码a.test()从变成a.__c(“test”)()统一函数入口

2 使用context获取调用defineclass时候的参数拆解成类名,函数名,js代码,把js执行代码放入dic[类名][函数名],并把函数IMP指向_objc_msgForward让函数进入方法转发流程并把ForwardInvocation的IMP指向JPForwardInvocation(以便获取原来的函数参数类型)

3 当函数执行的时候进入方法转发,进入JPForwardInvocation。通过方法签名获取原来函数名然后通过dic[类名][函数名]获取到对应的js代码。

4 执行代码。

执行代码

1 在一开始加载代码时js代码的时候如a.alloc.init会正则替换成A.__c(“alloc”)().__c(“init”)()。

2 执行A.__c(“alloc”)()时候在js的__c方法里面获取函数名alloc以及其参数,并传给_methodFunc函数最终调用_OC_callC(类方法)。

3 context截取_OC_callC方法并根据类名和函数名参数运行并返回一个实例变量地址address。

4 把实例变量地址__obj以及类名通过context传回给js,现在js代码相当于__obj.__c(“init”)()。

5 再次在__c方法里面获取函数名alloc以及其参数,并传给_methodFunc函数最终调用_OC_callI(实例方法)。

6context截取_OC_callI方法并根据实例名和函数名参数运行。

(注:里面判断是否实例变量是通过判断__obj是否存在。)

你可能感兴趣的:(JSPatch观后感)