博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android AOP编程
阅读量:6171 次
发布时间:2019-06-21

本文共 1577 字,大约阅读时间需要 5 分钟。

hot3.png

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");        }    });}

 

转载于:https://my.oschina.net/shanlilaideyu/blog/702614

你可能感兴趣的文章
学好SEO需要掌握哪些知识要点?
查看>>
JetBrains GoLand macv2019.1.2中文版如何换成无牵引模式?
查看>>
电气火灾监控系统工作原理
查看>>
中使馆驳斥《金融时报》“中国网络威胁论”
查看>>
【挨踢人物传】茶乡浪子:“传奇”职场路,一生感谢情(第12期)
查看>>
我的友情链接
查看>>
c#关于数据库连接操作的案例
查看>>
聊聊最近接触的媒体查询!
查看>>
HAproxy指南之haproxy重定向应用(案例篇)
查看>>
学习 HTTP协议挺不错的一个类
查看>>
深入字节码 -- ASM 关键接口 MethodVisitor
查看>>
linux 文件权限
查看>>
Linux常用命令集合
查看>>
Oracle DML
查看>>
Linux - FHS文件系统层次标准
查看>>
报错:Invalid bound statement (not found)
查看>>
Linux GPT分区格式磁盘的相关操作
查看>>
通过Docker进程pid获取容器id
查看>>
L15.2 zabbix基础(2)组件说明介绍
查看>>
impdp 常见问题 10g/11g/12c 问题解决 ERIKXUE
查看>>