广西十一选五玩法|广西十一选五开奖查询
  • Android開發中的面向切面編程AOP

    發布:51Code 時間: 2019-02-11 10:50

  • 目錄 有什么用 App中很多跳轉的地方都需要登入校驗,無非就是if-else,但是如果這樣的判斷有很多,我們就得重復很多次,或者有一天需求變動,有可能就會更改多個地方。類似的還有...

  • 目錄

    有什么用

    • App中很多跳轉的地方都需要登入校驗,無非就是if-else,但是如果這樣的判斷有很多,我們就得重復很多次,或者有一天需求變動,有可能就會更改多個地方。類似的還有網絡判斷,權限管理,Log日志的統一管理這樣的問題,如果更優雅的實現這些功能呢?

    • App 調試時,如果一眼無法看出錯誤在哪里,有時會把一些關鍵信息打印出來,如何快速將方法的入參和出參都打印出來?

    • 如何安全地執行方法,不用考慮異常情況?

    • …….

    什么是AOP?

    在軟件業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

    AOP 解決 OOP 中遇到的一些問題.是 對OOP 的延續和擴展

    AOP中的術語

    • Joinpoint(連接點):所謂連接點是指那些被攔截到的點。

    • Pointcut(切入點):所謂切入點是指我們要對哪些 Joinpoint 進行攔截的定義。

    • Advice(通知/增強):所謂通知是指攔截到 Joinpoint 之后所要做的事情就是通知。

    • Introduction(引介):引介是一種特殊的通知在不修改類代碼的前提下, Introduction 可以在運行期為類 動態地添加一些方法或 Field。

    • Target(目標對象):代理的目標對象。

    • Weaving(織入):是指把增強應用到目標對象來創建新的代理對象的過程.   AspectJ 采用編譯期織入和類裝在期織入 。

    • Proxy(代理):一個類被 AOP 織入增強后,就產生一個結果代理類 。

    • Aspect(切面):是切入點和通知(引介)的結合 。

    Advice分類:

    Android中如何使用AOP?

    AspectJ 介紹

    AspectJ是一個面向切面編程的框架。AspectJ是對java的擴展,而且是完全兼容java的,AspectJ定義了AOP語法,它有一個專門的編譯器用來生成遵守Java字節編碼規范的Class文件。AspectJ還支持原生的Java,只需要加上AspectJ提供的注解即可。在Android開發中,一般就用它提供的注解和一些簡單的語法就可以實現絕大部分功能上的需求了。

    下面通過一個例子來說明一下AOP中各個術語的含義:

    假設UserDao 中的四個方法均已實現,現在需要對delete()方法加入權限校驗。那么我們就需要對UserDao 這個類進行增強,那么UserDao這個類就是Target(目標對象),而該類中有四個方法,我們現在只對delete()方法進行改造,所以delete()就是Pointcut(切入點);其他方法都是Joinpoint(連接點);新增的權限校驗方法就是Advice(通知);Introduction(引介)是對類方面的增強;將通知應用到目標的過程就是 Weaving(織入)

    切入點表達式語法

    語法如下:

    切入點指示符([訪問修飾符] 方法的返回值類型 包名.類名.方法名(參數))

    AspectJ類型匹配的通配符:

    切入點指示符

    切入點指示符用來指示切入點表達式目的,AspectJ切入點指示符如下:

    AspectJ切入點支持的切入點指示符還有: call、get、set、preinitialization、staticinitialization、initialization、handler、adviceexecution、withincode、cflow、cflowbelow、if、@this、@withincode。

    切入點語法詳細說明

    Android 中使用Gradle集成 AspectJ

    在Android中集成AspectJ,主要思想就是hook Apk打包過程,使用AspectJ提供的工具來編譯.class文件。自己手動接入AspectJ的話,比較繁瑣。目前有一些在Android中集成AspectJ的比較火的框架,如JakeWharton的 gradle_plugin_android_aspectjx。該框架支持kotlin。這里就使用該框架做演示,不再自己手動接入。

    在項目根目錄build.gradle下引入aspectjtools插件:

    在module目錄下的build.gradle中引入插件和依賴:(注釋部分)

    至此Aspectj的環境已經搭建好了,下面通過一個登入檢查的例子來說明它如果使用。

    1.創建Target(目標類)

    @Retention(AnnotationRetention.RUNTIME)//存儲在編譯后的 Class 文件,反射可見。

    @Target(AnnotationTarget.FUNCTION)//方法(不包括構造函數)

    annotation class CheckLogin

    這里創建的是一個注解,所有被該注解標識的方法都是接入點

    關于Target和Retention參數的說明:

    2.創建切面AspectJ

    這是方便演示判斷登入的方法省略直接用一個變量isLogin 來代替了,只要明白意思即可。

    3.創建測試類

    test方法被@CheckLogin修飾,會先判斷是否登入,如果登入了就會執行text方法中的代碼,上面我們模擬的是沒有登入isLogin = false,所以程序的運行結果就是提示:請先登入,而不會執行test方法中的代碼。這樣在需要檢測登入的操作方法上添加上@CheckLogin即可實現登入校驗的操作,當登入校驗的邏輯發生改變的時候,我們也不需要改動調用的地方。

    當然我們可以使用通配符“*”對項目中所有的的某個方法進行增強操作。

    總結

    AOP是對OOP的擴展,OOP強調的是縱向的,而AOP是橫向的,假如項目中有很多個刪除的方法,現在都需要對刪除方法加上校驗的操作,一種是:定義一個基類,在基類中實現權限校驗的功能,然后去集成它,這樣所有用到的地方都得修改,繼承就是縱向的;第二種就是利用AOP,使用代理對象,這樣所有用到刪除的方法是橫向的,組成一個面。

    文章來源:https://mp.weixin.qq.com/s/zc9zR23XX8VIVCbT0LcOXg
    上文內容不用于商業目的,如涉及知識產權問題,請權利人聯系博為峰小編(021-64471599-8103),我們將立即處理。

  • 上一篇:Android程序員的Java后臺學習建議

    下一篇:程序員:為什么幾個月后我自己寫的代碼看不懂

網站導航
Copyright(C)51Code軟件開發網 2003-2019 , 滬ICP備05003035號-6
广西十一选五玩法 全天重庆彩计划万位 时时彩后二稳赚技巧 内蒙古时时综合走势 湖北新11选5技巧 稳赚 安徽时时劫介绍 定胆新方法 捕鱼达人2经典版本 利鑫彩票是真的吗 北京pk10高手技术分享 快速时时计划