加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

aspect原理分析

发布时间:2020-12-16 09:26:09 所属栏目:asp.Net 来源:网络整理
导读:人的记忆能力是有限的,分析、建模与解释能力是无限的 ? Call Hierarchy ? isa hook ?? aspect_hookClass() ? ? ? aspect_prepareClassAndHookSelector() ?? ? ? ? aspect_add() ? ? ? ? ? ? +[NSObject aspect_hookSelector:withOptions:usingBlock:error:]

人的记忆能力是有限的,分析、建模与解释能力是无限的

?

Call Hierarchy

?

isa hook

?? aspect_hookClass()

? ? ? aspect_prepareClassAndHookSelector()

?? ? ? ? aspect_add()

? ? ? ? ? ? +[NSObject aspect_hookSelector:withOptions:usingBlock:error:]

?? ? ? ? ? ? ? +[NSURLCache load]

?

解释系统重定向

aspect_swizzleForwardInvocation()

?? aspect_hookClass()

? ? ? aspect_prepareClassAndHookSelector()

?? ? ? ? aspect_add()

? ? ? ? ? ? +[NSObject aspect_hookSelector:withOptions:usingBlock:error:]

?? ? ? ? ? ? ? +[NSURLCache load]

?

?

(解释)转发系统重定向

aspect_getMsgForwardIMP()

?? aspect_prepareClassAndHookSelector()

? ? ? aspect_add()

?? ? ? ? +[NSObject aspect_hookSelector:withOptions:usingBlock:error:]

? ? ? ? ? ? +[NSURLCache load]

?

?

// We use forwardInvocation to hook in.

? ? ? ? class_replaceMethod(klass,selector,aspect_getMsgForwardIMP(self,selector),typeEncoding);

?

?

整体原理

上面讲了几种消息转发的方法,Aspects主要是利用了forwardInvocation进行转发,Aspects其实利用和kvo类似的原理,通过动态创建子类的方式,把对应的对象isa指针指向创建的子类,然后把子类的forwardInvocation的IMP替成__ASPECTS_ARE_BEING_CALLED__,假设要hook的方法名XX,在子类中添加一个Aspects_XX的方法,然后将Aspects_XX的IMP指向原来的XX方法的IMP,这样方便后面调用原始的方法,再把要hook的方法XX的IMP指向_objc_msgForward,这样就进入了消息转发流程,而forwardInvocation的IMP被替换成了__ASPECTS_ARE_BEING_CALLED__,这样就会进入__ASPECTS_ARE_BEING_CALLED__进行拦截处理,这样整个流程大概结束。

?

https://www.jianshu.com/p/0d43db446c5b

?

?

?

人的记忆能力是有限的,分析、建模与解释能力是无限的

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读