AOP(Aspect-Oriented Programming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
摘自
我举个例子吧,不大擅长讲理论的东西 你的程序写好了 现在发现要针对所有业务操作添加一个日志,或者在前面加一道权限控制,怎么办呢? 传统的做法是,改造每个业务方法 这样势必把代码弄得一团糟 而且以后再扩展还是更乱 aop的思想是引导你从另一个切面来看待和插入这些工作日志,不管加在哪,它其实都是属于日志系统这个角度的 权限控制也一样 aop允许你以一种统一的方式在运行时期在想要的地方插入这些逻辑
摘自
Java阵营中,可以有AspectJ,JBoss AOP,Spring AOP……,ASP.net MVC中的Filter可以看成是AOP,还有Postsharp(),Aspect#,AspectDNG,Eos AOP……,Android中则可以使用,阿里基于Xposed开源了,其首页介绍了如何使用:
Gradle配置
dependencies { compile 'com.taobao.android:dexposed:0.1.1@aar'}
初始化
尽早的插入如下代码,比如在Activity的OnCreate中
if (DexposedBridge.canDexposed(this)) { //要织入的代码}
例子(before)
DexposedBridge.findAndHookMethod(TestView.class, "onDraw", Canvas.class,new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { //before 方法体 }}
其中第一个参数为要织入的类名,第二个参数是要织入的方法名,第三个参数时方法的参数(onDraw(Canvas canvas))。
最终,OnCreate中代码类似:
if (DexposedBridge.canDexposed(this)) { DexposedBridge.findAndHookMethod(TestView.class, "onDraw", Canvas.class,new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); Log.i("android01","Before draw"); } });}