真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

AndroidaspectJAop

基于aspectJ實(shí)現(xiàn)埋點(diǎn)操作
配置環(huán)境:
直接使用大神的:https://github.com/JakeWharton/hugo

成都創(chuàng)新互聯(lián)公司成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元澄海做網(wǎng)站,已為上家服務(wù),為澄海各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

先配置
項(xiàng)目 build.gradle

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

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

@Around 環(huán)繞插入。參數(shù)為ProceedingJoinPoint,可以手動(dòng)包裹代碼后,在需要的條件中調(diào)用參數(shù)的方法 proceed() 表示執(zhí)行目標(biāo)方法

@Before 前置插入。在切點(diǎn)前執(zhí)行

@After 后置插入。在切點(diǎn)后執(zhí)行

@After returning。在返回值之后執(zhí)行

@After throwing。在拋出異常后執(zhí)行

注意: 只有Around參數(shù)是ProceedingJoinPoint,需要調(diào)用proceed執(zhí)行方法,其他的都只是前后插入,不會(huì)影響原有代碼的執(zhí)行

在AspectJ的切入點(diǎn)表達(dá)式中最常用的是call和execution
call:調(diào)用此方法的地方切點(diǎn)
execution:方法內(nèi)部切點(diǎn)

表達(dá)式說明

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

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

  • 同時(shí),這里可以通過&&、||、!來進(jìn)行條件組合。()代表這個(gè)方法的參數(shù),你可以指定類型,
  • 例如android.os.Bundle,或者(..)這樣來代表任意類型、任意個(gè)數(shù)的參數(shù)
@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);
    }

    /**
     * 第一個(gè)*表示返回值,*表示返回值為任意類型,后面這個(gè)就是典型的包名路徑,其中可以包含 * 來進(jìn)行通配,幾個(gè) * 沒區(qū)別。
     * 同時(shí),這里可以通過&&、||、!來進(jìn)行條件組合。()代表這個(gè)方法的參數(shù),你可以指定類型,
     * 例如android.os.Bundle,或者(..)這樣來代表任意類型、任意個(gè)數(shù)的參數(shù)
     */
    /**
     * Around呢,從字面含義上來講,也就是在方法前后各插入代碼,是的,他包含了Before和After的全部功能
     */
    @Around("call(* com.home.dot.androidautodot.MainActivity.testBefore(..))")
    public void aroundTest(ProceedingJoinPoint joinPoint) throws Throwable {
        if (isInvokeProceed) {//isInvokeProceed為false則不執(zhí)行原始方法(也就是不執(zhí)行testBefore方法的內(nèi)部代碼)
            joinPoint.proceed();//代表執(zhí)行原始的方法 在這之前、之后,都可以進(jìn)行各種邏輯處理
            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()都調(diào)用了aspectJTest方法,
     * 但只想在aspectJ2調(diào)用aspectJTest時(shí)插入代碼
     */

    @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());
        }
    }
}

名稱欄目:AndroidaspectJAop
本文路徑:http://weahome.cn/article/gsooih.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部