首先使用hujiang的AspectJ贫母,地址https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
跨细,因?yàn)樗С謐otlin称诗,而官方的不支持kotlin,只支持java眯牧,官方地址https://github.com/eclipse/org.aspectj
AspectJ 是面向切向編程(aop)的一個(gè)實(shí)踐话浇,通常用來進(jìn)行功能增強(qiáng)挽鞠,或者進(jìn)行統(tǒng)計(jì)跟蹤等功能牵署。它的原理是在字節(jié)碼層級(jí)上使用自己獨(dú)有的一個(gè)編譯器對(duì)字節(jié)碼文件進(jìn)行處理漏隐,已達(dá)到我們需要的目的。
1.貼上git demo地址https://github.com/dongdaniqng/Android-AspectJ-Demo
2.項(xiàng)目結(jié)構(gòu)
app::用來測(cè)試aspectj功能奴迅,一般是我們的業(yè)務(wù)module
aspectjlib:用來進(jìn)行切點(diǎn)定義青责,切向相關(guān)代碼邏輯代碼編寫
3.依賴關(guān)系
根目錄build.gradle,主要添加classpath:
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
google()
jcenter()
}
dependencies {
...
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.6'
...
}
}
app模塊build.gradle,添加插件依賴:
...
apply plugin: 'android-aspectjx'
...
dependencies {
...
implementation project(":aspectjlib")
...
}
aspectjlib模塊build.gradle:
dependencies {
...
implementation 'org.aspectj:aspectjrt:1.8.14' \\里面包含需要使用的注解等
...
}
4.詳解aspectjlib模塊
1.首先半沽,創(chuàng)建一個(gè)以@Aspect注解的類爽柒,定義切向類吴菠,向下面這樣:
@Aspect
class AOP_ViewClick {
//業(yè)務(wù)code
}
2.定義切點(diǎn)者填,說白了,就是描述你想在代碼的哪個(gè)位置進(jìn)行功能增強(qiáng):
@Before("execution(* android.view.View.OnClickListener.onClick(android.view.View))")
fun log(joinPoint: JoinPoint){
val view = joinPoint.args[0] as View
Log.e("tag",view.contentDescription.toString())
}
execution(* android.view.View.OnClickListener.onClick(android.view.View)) 這行代碼就是我們定義的切點(diǎn)做葵,我們要在View的onClick的時(shí)候進(jìn)行某些不可描述的操作占哟。
3.接下來,我們需要定義切點(diǎn)的運(yùn)行時(shí)機(jī)酿矢,常用的有:
@Before:在方法代碼的最前面執(zhí)行
@After:在方法代碼的最后面執(zhí)行
@Around:可以在方法的前后都執(zhí)行
4.編寫具體的切點(diǎn)邏輯:
@Before("execution(* android.view.View.OnClickListener.onClick(android.view.View))")
fun log(joinPoint: JoinPoint){
val view = joinPoint.args[0] as View
Log.e("tag",view.contentDescription.toString())
}
上面的代碼我們打印出了我們切點(diǎn)view的一個(gè)屬性contentDescription榨乎。
5.總結(jié)
AspectJ很簡(jiǎn)單,像上面那樣瘫筐,就很容易的實(shí)現(xiàn)了方法的增強(qiáng)處理蜜暑,而且侵入性很低,使用簡(jiǎn)單策肝。