框架【库】

AOP在安卓上的实现

2019-06-27  本文已影响32人  码农呀

在文章的开篇,我觉得我们有必要先了解AOP是个什么东东,AOP和OOP又有什么区别,
这个时候小伙伴们就避免不了百度一波啦~
笔者也去百度了一波,可以搜到这么解释:AOP(Aspect Oriented Programming)是面向切面编程,AOP和我们平时接触的OOP编程是不同的编程思想,OOP是面向对象编程,提倡的是将功能模块化,对象化。

那么我们就会有一个疑问,什么是面向切面?为什么叫切面?
在数学中,百度是这么解释的只包含圆柱丶圆锥的一条母线的平面,称作圆柱或圆锥的切面,
在Java中,别人是这么解释的把非业务逻辑相关的代码抽取出来定位到具体的连接点上的一种实现方式
这两者可以翻译成一个共同点就是把一个集中的部分划分出来处理.那么可以解释为AOP.
从思想上我们可以这么理解了,那么在代码层面又是怎么利用起来呢?
带着疑问,我又去百度了一波.别说,还真的挺有用的!!
百度是这么说的:市面上实现了AOP思想的方式主要有两种,那就是ASpectJ和Lancet.
Lancet是安卓的一个轻量级的AOP框架,它只能支持hook具体的方法,而ASpectJ则支持hook整个类或者方法
不过Lancet的好处在于他是轻量的,只需要几行代码就能完成注入
P话那么多,no code say J8?
肯定不会的,那么我们去CV一下:
AspectJ:
首先,我们在根build.gradle上添加一个东东:classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.8'
然后,我们在app或者你的猫丢了的build.gradle的dependencies下添加: compile 'org.aspectj:aspectjrt:1.8.9',在顶部上添加:apply plugin: 'android-aspectjx'
如果出现编译失败,那么请添加
aspectjx {
includeJarFilter 'universal-image-loader', 'AspectJX-Demo/library'
excludeJarFilter 'universal-image-loader'
}
如果还不行,请放弃,因为我也不知道!!!!!!!!!!!
看个栗子:
我们先创建一个AspectJ文件
@Aspect
public class AspectDemo {

private static final String TAG = "AspectDemo ";

@Before("execution(* android.app.Activity.on**(..))")
public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable {
    String msg= joinPoint.getSignature().toString();
    Log.d(TAG, "onActivityMethodBefore: " + msg);
}

}
然后在Act中
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

}
当我们APP编译了之后,会在build目录下生成一个文件,在onCreate的最前面会插入一段AspectJ的代码

上一篇下一篇

猜你喜欢

热点阅读