AOP之Aspectj 使用

關(guān)于Aspectij 在android 中的使用

在 app目錄下的bulid.gradle 文件中配置如下信息:

dependencies {
    ....
    //這樣子不需要在lib 文件夾中引入jar 包
    compile 'org.aspectj:aspectjrt:1.9.2'
    //這種需要在lib 文件中放入jar包
    //compile file(libs/aspectjrt.jar)
}
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.aspectj:aspectjtools:1.9.2'
        classpath 'org.aspectj:aspectjweaver:1.9.2'
    }
}

repositories {
    mavenCentral()
}
final def log = project.logger
final def variants = project.android.applicationVariants

variants.all { variant ->
    if (!variant.buildType.isDebuggable()) {
        log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
        return
    }

    JavaCompile javaCompile = variant.javaCompile
    javaCompile.doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.9",
                         "-inpath", javaCompile.destinationDir.toString(),
                         "-aspectpath", javaCompile.classpath.asPath,
                         "-d", javaCompile.destinationDir.toString(),
                         "-classpath", javaCompile.classpath.asPath,
                         "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
        log.debug "ajc args: " + Arrays.toString(args)

        MessageHandler handler = new MessageHandler(true)
        new Main().run(args, handler)
        for (IMessage message : handler.getMessages(null, true)) {
            switch (message.getKind()) {
                case IMessage.ABORT:
                case IMessage.ERROR:
                case IMessage.FAIL:
                    log.error message.message, message.thrown
                    break
                case IMessage.WARNING:
                    log.warn message.message, message.thrown
                    break
                case IMessage.INFO:
                    log.info message.message, message.thrown
                    break
                case IMessage.DEBUG:
                    log.debug message.message, message.thrown
                    break
            }
        }
    }

如上配置完成,下面編寫代碼
新建注解類

 //表示方法上的注解
@Target(ElementType.METHOD)
//運(yùn)行時注解
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckPerformance {
}

新建需要自定義行為的類

//注意需要加上 Aspect 注解
@Aspect
public class MethodBehaviorAspect {
    //新建方法 增加 Pointcut 注解 后面對應(yīng)注解類的包名
    @Pointcut("execution(@com.lsghelper.Aspectj.CheckPerformance * *(..))")
    public void firstMethodAnnotationBehavior() {

    }

    //新建方法 增加 Around 注解 處理你想要的邏輯
    @Around("firstMethodAnnotationBehavior()")
    public Object CheckPerformance(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        //類名
        String simpleName = methodSignature.getDeclaringType().getSimpleName();
        //方法名
        String name = methodSignature.getName();
        CheckPerformance checkPerformance = methodSignature.getMethod().getAnnotation(CheckPerformance.class);
        long start = System.currentTimeMillis();
        //注意,調(diào)用這一句之后代表你注解的方法已經(jīng)執(zhí)行完成
        Object proceed = joinPoint.proceed();
        if (checkPerformance != null) {
            long end = System.currentTimeMillis();
            Log.e("TAG", "耗時: ---->" + (end - start));
        }
        return proceed;
    }
}

之后在對應(yīng)的方法中使用注解

    @CheckPerformance
    public void hookHanlder() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
}

以上就是Aspectj 在android 中的使用方法。
至于其原理,和 ButterKnife 基本一致,主要在編譯時修改增加了注解的對應(yīng)的方法,自己拼接上我們寫的邏輯,具體可以反編譯 apk 查看可知。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,802評論 25 709
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,918評論 2 59
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,255評論 6 342
  • W: 早上好!因?yàn)槟銈凈[離婚的事情,一個是我十多年的閨蜜,一個是我八年的鐵哥們。我大半夜未眠,在懷疑婚姻的同時,也...
    優(yōu)優(yōu)和吖吖閱讀 12,147評論 5 5
  • 你說怕被前人稱呼過,其實(shí)靖哥哥就沒人叫過,最多的是朋友間的玩笑話才會出現(xiàn),當(dāng)然,如果愿意可以叫我周子靖或者穎穎她男...
    _你的貓閱讀 682評論 0 0

友情鏈接更多精彩內(nèi)容