AspectJ之切點(diǎn)語法

AspectJ簡(jiǎn)介

AOP雖然是方法論播瞳,但就好像OOP中的Java一樣,一些先行者也開發(fā)了一套語言來支持AOP。目前用得比較火的就是AspectJ了塔沃,它是一種幾乎和Java完全一樣的語言腰奋,而且完全兼容Java(AspectJ應(yīng)該就是一種擴(kuò)展Java单起,但它不是像Groovy那樣的拓展)。當(dāng)然氛堕,除了使用AspectJ特殊的語言外馏臭,AspectJ還支持原生的Java,只要加上對(duì)應(yīng)的AspectJ注解就好讼稚。所以括儒,使用AspectJ有兩種方法:
1.完全使用AspectJ的語言。這語言一點(diǎn)也不難锐想,和Java幾乎一樣帮寻,也能在AspectJ中調(diào)用Java的任何類庫(kù)。AspectJ只是多了一些關(guān)鍵詞罷了赠摇。
2.或者使用純Java語言開發(fā)固逗,然后使用AspectJ注解,簡(jiǎn)稱@AspectJ藕帜。

AspectJ現(xiàn)在托管于Eclipse項(xiàng)目中烫罩,官方網(wǎng)站是:

詳情請(qǐng)查看: 深入理解Android之AOP

下面我們以簡(jiǎn)單的程序來看下最簡(jiǎn)單的AspectJ語法:

    @Aspect
    public class AspectJTest {
        private static final String TAG ="AspectJTest" ;

        @Before("execution (* android.app.Activity.on**(..))")
        public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable{
              Log.e(TAG,joinPoint.getSignature().toString()+":beforecall");            }
    }
  • @Aspect: 注解表明這是一個(gè)AspectJ文件贝攒,編譯器在編譯的時(shí)候,就會(huì)自動(dòng)去解析时甚,然后將代碼注入到相應(yīng)的JPonit中隘弊。
  • @Before: Advice,也就是具體的插入點(diǎn)哈踱。
  • execution: 處理JPoint的類型,例如call梨熙,execution
  • (* android.app.Activity.on**(..)):這個(gè)是最重要的表達(dá)式开镣,第一個(gè)[]表示返回值,* 表示返回任意類型咽扇,后面的android.app.Activity.on**表示典型的包名路徑邪财,其中可用 * 來進(jìn)行通配,幾個(gè) * 都沒有區(qū)別肌割。同時(shí)卧蜓,這里可以通過 &&,||,! 來進(jìn)行條件組合,例如:
    @Before("execution (
    android.app.Activity.onCreate(..)) || "
    + "execution (* android.app.Activity.onDestroy())")
    public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable{
    Log.e(TAG,joinPoint.getSignature().toString()+":beforecall");
    }

從上面的例子我們可以看出把敞,前面所用的AOP代碼注入方法都是直接指定相應(yīng)的pointcut進(jìn)行切入弥奸。如果說此時(shí)我們又需要對(duì)某個(gè)函數(shù)進(jìn)行代碼切入,那么我們又必須重新寫一個(gè)相應(yīng)的pointcut奋早,重新寫個(gè)方法進(jìn)行代碼切入盛霎。那么,有沒有更加方便的一種方法耽装,可以讓我們很方便的直接進(jìn)行指定就能實(shí)現(xiàn)代碼切入呢愤炸?通過自定義Pointcuts的方法可以實(shí)現(xiàn)上述所需功能。

自定義Pointcuts

自定義Pointcuts可以讓我們更加精確的切入一個(gè)或多個(gè)指定的切入點(diǎn)掉奄。其具體操作步驟如下:
1.首先规个,我們需要自定義一個(gè)注解類

@Retention(RetentionPolicy.CLASS)
@Target({ElementType.CONSTRUCTOR,ElementType.METHOD})
public @interface AopLog {}

2.然后,創(chuàng)建一個(gè)切面文件姓建,內(nèi)部通過一個(gè)Pointcut來指定在帶有我們上面自定義注解類AopLog注解的所有方法上進(jìn)行攔截诞仓。

    @Aspect
    public class AopLogPointcut {
        //在帶有AopLog注解的方法進(jìn)行切入(注:此處的 * *前面都要有一個(gè)空格)
        @Pointcut("execution(@com.yn.aspectj.selfmakeaop.AopLog * *(..))")
        public void logPointcut(){} //注意,這個(gè)函數(shù)必須要有實(shí)現(xiàn)速兔,否則Java編譯器會(huì)報(bào)錯(cuò)

        @After("logPointcut()")
        public void onLogPointcutAfter(JoinPoint joinPoint) throws Throwable{
            Log.i("AOP","onLogPointcutAfter:"+joinPoint.getSignature());
            }
    }

3.最后墅拭,只需要在要進(jìn)行切入的函數(shù)前加上@AopLog注解即可。
public class MainActivity extends Activity {

         @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            testAopLog();
        }

        @AopLog
        public void testAopLog() {
            Log.i("AOP","in testAopLog");
        }
    }

掌握上述方法涣狗,則AOP基本編程便可以使用了谍婉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市镀钓,隨后出現(xiàn)的幾起案子穗熬,更是在濱河造成了極大的恐慌,老刑警劉巖丁溅,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件死陆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡唧瘾,警方通過查閱死者的電腦和手機(jī)措译,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饰序,“玉大人领虹,你說我怎么就攤上這事∏笤ィ” “怎么了塌衰?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蝠嘉。 經(jīng)常有香客問我最疆,道長(zhǎng),這世上最難降的妖魔是什么蚤告? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任努酸,我火速辦了婚禮,結(jié)果婚禮上杜恰,老公的妹妹穿的比我還像新娘获诈。我一直安慰自己,他們只是感情好心褐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布舔涎。 她就那樣靜靜地躺著,像睡著了一般逗爹。 火紅的嫁衣襯著肌膚如雪亡嫌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天掘而,我揣著相機(jī)與錄音挟冠,去河邊找鬼。 笑死镣屹,一個(gè)胖子當(dāng)著我的面吹牛圃郊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播女蜈,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼持舆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了伪窖?” 一聲冷哼從身側(cè)響起逸寓,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎覆山,沒想到半個(gè)月后竹伸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年勋篓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吧享。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡譬嚣,死狀恐怖钢颂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拜银,我是刑警寧澤殊鞭,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站尼桶,受9級(jí)特大地震影響操灿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泵督,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一趾盐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幌蚊,春花似錦谤碳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至漩仙,卻和暖如春搓茬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背队他。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工卷仑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人麸折。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓锡凝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親垢啼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窜锯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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