AOP

最近做了AOP, 监测工程中的某些数据. 但是不能影响原工程, 也不在原工程中写代码; 面向切面编程, AOP.
首先使用了个开源的第三方, Aspects;
关于框架的搭建
第一个版本主要是收集Node中的数据. 之后肯定还会收集其他的数据; 主要就是对 WebSocket 中的方法, 插入代码. 所以需要一个管理类, 管理要去收集哪些数据; 在管理类中有一个数组, 其中存放着使用了的对象.这些对象去收集需要的数据; 这些对象可随时添加和移除; 这些对象都有一些公共特征, 所以写成一个公共的基础类(baseObject);
既然是面向切面编程, 不能影响了原代码的效率, 所以需要在自己的线程中处理;

Node数据收集
思路:在WebSocket调用 setDelegate: 的时候, 把delegate 设置成自己的对象, 操作后再转发给原来的对象; 在继承于baseObject的类中, 要去设置新的代理, 并给其他需要关注的方法插入代码. 本来想着使用单例, 这样就可以保证只有一个对象管理WebSocket的有关代码.但是这样用的单例太多, 其实完全没有必要.(之前为什么会用单例, 是因为在管理类中, 要控制Socket 数据收集的开启和关闭, 因为不在一个方法中, 所以不能找到同一个对象, 使用了数组管理, 并且给其加上一个分类type标签, 就可以区分出具体的对象, 因为每种只有一个对象, 所以只需要一个是什么类型的标签就可以);
在hook方法中, 要对多个socket方法进行操作, 每次都要设置代理为A, 怎么可以保证是同一个A? 可以给 socket 添加一个属性, 每次找到的都是同一个A; 给 NSObject 写一个分类, 添加一个属性, 用来存储新的代理对象; 因为如果外界使用了两个 socket 只有一个代理的话, 肯定是不对的;
我们其实没有使用 socket 对象, 只是代理方法中, 引用了 Socket对象, 我们将代理方法中的socket 改成 id类型, 就不必依赖 WebSocket 框架了.


posted @ 2017-08-09 11:00  侯文超  阅读(141)  评论(0编辑  收藏  举报