AOP面向切面編程

概念

android中的類都是java文件,系統(tǒng)編譯我們寫的代碼時,會先把java文件編譯成.class文件,aop編程就是在java文件編譯成.class文件的過程中,向java文件中添加了一些額外的處理.
我們把添加額外處理的地方稱為切入點
把添加的處理內(nèi)容稱為面
把添加額外處理的操作稱為面向切面編程,即aop編程

使用

aspect方式實現(xiàn)

https://github.com/chengdongba/Aspect

  1. 添加依賴
    modle的dependencies中
implementation 'org.aspectj:aspectjrt:1.9.4'

工程的dependencies中

classpath 'org.aspectj:aspectjtools:1.9.4'
  1. 添加自定義注解,定義切入點
/**
 * 用來表示性能監(jiān)控
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BehaviorTrace {
    String value();
}
  1. 添加額外的處理類,即添加面
@Aspect
public class BehaviorTraceAspect {
    //定義切面的規(guī)則
    //1祠丝、就再原來的應(yīng)用中那些注解的地方放到當前切面進行處理
    //execution(注解名   注解用的地方)
    @Pointcut("execution(@com.dqchen.aspect.annotation.BehaviorTrace *  *(..))")
    public void methodAnnottatedWithBehaviorTrace() {
    }


    //2尺借、對進入切面的內(nèi)容如何處理
    //@Before 在切入點之前運行
//    @After("methodAnnottatedWithBehaviorTrace()")
    //@Around 在切入點前后都運行
    @Around("methodAnnottatedWithBehaviorTrace()")
    public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {

        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String className = methodSignature.getDeclaringType().getSimpleName();
        String methodName = methodSignature.getName();
        String value = methodSignature.getMethod().getAnnotation(BehaviorTrace.class).value();

        long begin = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        SystemClock.sleep(new Random().nextInt(2000));
        long duration = System.currentTimeMillis() - begin;
        Log.d("alan", String.format("%s功能:%s類的%s方法執(zhí)行了胯究,用時%d ms",
                value, className, methodName, duration));
        return result;
    }
}
  1. 在原來的java代碼中,找到需要添加額外處理的地方,加上2中定義的注解
    //語音消息
    @BehaviorTrace("語音消息")
    public void mAudio(View view) {
        Log.d("dn","123123132");
    }
 //視頻通話
    @BehaviorTrace("視頻通話")
    public void mVideo(View view) {
    }

    //發(fā)表說說
    @BehaviorTrace("發(fā)表說說")
    public void saySomething(View view) {
    }
proxy方式

https://github.com/chengdongba/AopProxy

  1. 切入點,切入面
    定義要代理的接口,接口中定義要插入的方法
public interface ILogin {
    void toLogin();
}
  1. 插入
    在要切入的類中得到接口的代理類
proxyLogin = (ILogin) Proxy.newProxyInstance(
                this.getClassLoader(), //類加載器
                new Class[]{ILogin.class}, //需要代理的類
                new MyHandler(this, this)//代理InvocationHandler
        );

在InvocationHandler中重寫invoke方法,攔截代理類中的方法,并添加要切入的代碼

  @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        if (ShadPreferenceUtil.getBooleanSp(ShadPreferenceUtil.IS_LOGIN,context)){
            result = method.invoke(target,args);
        }else {
            Intent intent = new Intent(context,LoginActivity.class);
            context.startActivity(intent);
        }
        return result;
    }

在要插入的方法中,調(diào)用代理類的方法

   /**
     * 我的淘寶
     * @param view
     */
    public void me(View view) {
        proxyLogin.toLogin();
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沿癞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吮铭,更是在濱河造成了極大的恐慌厚柳,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沐兵,死亡現(xiàn)場離奇詭異别垮,居然都是意外死亡,警方通過查閱死者的電腦和手機扎谎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門碳想,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毁靶,你說我怎么就攤上這事胧奔。” “怎么了预吆?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵龙填,是天一觀的道長。 經(jīng)常有香客問我拐叉,道長岩遗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任凤瘦,我火速辦了婚禮宿礁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔬芥。我一直安慰自己梆靖,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布笔诵。 她就那樣靜靜地躺著返吻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乎婿。 梳的紋絲不亂的頭發(fā)上测僵,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音次酌,去河邊找鬼恨课。 笑死,一個胖子當著我的面吹牛岳服,可吹牛的內(nèi)容都是我干的剂公。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼吊宋,長吁一口氣:“原來是場噩夢啊……” “哼纲辽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起璃搜,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤拖吼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后这吻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吊档,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年唾糯,在試婚紗的時候發(fā)現(xiàn)自己被綠了怠硼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡移怯,死狀恐怖香璃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舟误,我是刑警寧澤葡秒,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布嵌溢,位于F島的核電站眯牧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赖草。R本人自食惡果不足惜炸站,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一旱易、第九天 我趴在偏房一處隱蔽的房頂上張望阀坏。 院中可真熱鬧忌堂,春花似錦士修、人聲如沸棋嘲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雹锣,卻和暖如春网沾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蕊爵。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工辉哥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人攒射。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓证薇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匆篓。 傳聞我的和親對象是個殘疾皇子浑度,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容