91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android aspectJ Aop

發布時間:2020-06-26 00:10:55 來源:網絡 閱讀:452 作者:home_xu 欄目:移動開發

基于aspectJ實現埋點操作
配置環境:
直接使用大神的:https://github.com/JakeWharton/hugo

先配置
項目 build.gradle

dependencies {     
    classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'   
}
app / build.gradle
apply plugin: 'com.jakewharton.hugo'

Advice 切點插入方式。表示在匹配的切點處,用什么方式去處理,一共有如下幾個類型:

@Around 環繞插入。參數為ProceedingJoinPoint,可以手動包裹代碼后,在需要的條件中調用參數的方法 proceed() 表示執行目標方法

@Before 前置插入。在切點前執行

@After 后置插入。在切點后執行

@After returning。在返回值之后執行

@After throwing。在拋出異常后執行

注意: 只有Around參數是ProceedingJoinPoint,需要調用proceed執行方法,其他的都只是前后插入,不會影響原有代碼的執行

在AspectJ的切入點表達式中最常用的是call和execution
call:調用此方法的地方切點
execution:方法內部切點

表達式說明

eg:call( com.home.dot..MainActivity.testBefore(..))

第一個表示返回值,表示返回值為任意類型,后面這個就是典型的包名路徑,其中可以包含 來進行通配,幾個 沒區別。

  • 同時,這里可以通過&&、||、!來進行條件組合。()代表這個方法的參數,你可以指定類型,
  • 例如android.os.Bundle,或者(..)這樣來代表任意類型、任意個數的參數
@Aspect
public class AspectEntity {
    public static final String TAG = "AspectEntity";
    private boolean isInvokeProceed = true;

    @Before("execution(* android.app.Activity.on*(..))")
    public void onStartBefore(JoinPoint joinPoint) {
        String key = joinPoint.getSignature().toString();
        Log.e(TAG, "onStartBefore:" + key);
    }

    /**
     * 第一個*表示返回值,*表示返回值為任意類型,后面這個就是典型的包名路徑,其中可以包含 * 來進行通配,幾個 * 沒區別。
     * 同時,這里可以通過&&、||、!來進行條件組合。()代表這個方法的參數,你可以指定類型,
     * 例如android.os.Bundle,或者(..)這樣來代表任意類型、任意個數的參數
     */
    /**
     * Around呢,從字面含義上來講,也就是在方法前后各插入代碼,是的,他包含了Before和After的全部功能
     */
    @Around("call(* com.home.dot.androidautodot.MainActivity.testBefore(..))")
    public void aroundTest(ProceedingJoinPoint joinPoint) throws Throwable {
        if (isInvokeProceed) {//isInvokeProceed為false則不執行原始方法(也就是不執行testBefore方法的內部代碼)
            joinPoint.proceed();//代表執行原始的方法 在這之前、之后,都可以進行各種邏輯處理
            Log.e(TAG, "aroundTest: test");
        }
        Log.e(TAG, "aroundTest end");
    }

    @Before("execution(* android.view.View.OnClickListener.onClick(..))")
    public void beforeAction() {
        Log.e(TAG, "beforeAction: ");
    }

    @After("execution(* android.view.View.OnClickListener.onClick(..))")
    public void afterAction() {
        Log.e(TAG, "afterAction: ");
    }

    /**
     * withincode的使用
     * eg:aspectJ1(),aspectJ2(),aspectJ3()都調用了aspectJTest方法,
     * 但只想在aspectJ2調用aspectJTest時插入代碼
     */

    @Pointcut("(call(* *..aspectJTest()))&&withincode(* *..aspectJ2())")
    public void invokeAspectJTestInAspectJ2() {
    }

    @Before("invokeAspectJTestInAspectJ2()")
    public void beforeInvokeaspectJTestInAspectJ2(JoinPoint joinPoint) throws Throwable {
        if (joinPoint != null) {
            Log.e(TAG, "method:" + joinPoint.getSignature());
        }
    }
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙田区| 黎川县| 江山市| 弥渡县| 花莲县| 日喀则市| 仪陇县| 湾仔区| 英吉沙县| 屯昌县| 丹棱县| 平原县| 富蕴县| 德州市| 石林| 明溪县| 临清市| 卢氏县| 崇义县| 蒲城县| 健康| 余姚市| 三亚市| 怀柔区| 德安县| 绍兴县| 双鸭山市| 大田县| 鄂伦春自治旗| 山西省| 介休市| 西青区| 永年县| 黎平县| 涟水县| 沁源县| 泾阳县| 沙洋县| 汽车| 寿光市| 冀州市|