1. 程式人生 > >Aspectj簡單使用(一)

Aspectj簡單使用(一)

Aspectj切面程式設計,舉個例子,當你要統計多個方法單獨的執行時間,你應該會在每個方法中都有一個記錄執行前的時間和執行後的時間,當要修改統計時間的方法時,你就要每個方法中去修改,很麻煩,看看用Aspectj怎麼做。


MainActivity

public class MainActivity extends AppCompatActivity {

    static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @BehaviorTrace("搖一搖")
    public void mShake(View btn){
        SystemClock.sleep(new Random().nextInt(500));
        Log.d(TAG, "搖一搖功能被使用");
    }

    @BehaviorTrace(value = "傳送語音")
    public void mAudio(View btn){
         SystemClock.sleep(new Random().nextInt(500));
         Log.d(TAG, "語音訊息功能被使用");
    }
    public void mVideo(View btn){
        long begin = System.currentTimeMillis();
        {
            SystemClock.sleep(new Random().nextInt(500));
            Log.d(TAG, "視訊通話功能被使用");
        }
        long duration = System.currentTimeMillis() - begin;
        Log.d(TAG, "視訊通話功能被使用,耗時:" + duration);

    }
}

BehaviorAspect.java

@Aspect
public class BehaviorAspect {

    private static final String TAG = "BehaviorAspect";

    //切面有哪些方法組成     //只要標註了BehaviorTrace的方法,這個方法就屬於這個切面
    @Pointcut("execution(@com.jsonaop.annotation.BehaviorTrace * *(..))")
    public void annoBehavior(){
    }

    //針對切面進行程式設計 onShake方法會到這個方法中執行
    @Around("annoBehavior()") //環繞切點
    public Object joinPoint(ProceedingJoinPoint joinPoint) throws Throwable{

        Log.d("BehaviorAspect","走我了");
        long begin = System.currentTimeMillis();

        //方法執行時
        Object object=null;
        try {
            object=joinPoint.proceed();//執行這句程式碼,mShake方法會執行
        }catch (Exception e)
        {
        }

        long duration = System.currentTimeMillis() - begin;

        //獲取功能名稱
        MethodSignature singnature = (MethodSignature) joinPoint.getSignature();
        Log.d(TAG,singnature.getName());
        BehaviorTrace behaviorTrace = singnature.getMethod().getAnnotation(BehaviorTrace.class);
//        Log.e(TAG,behaviorTrace.toString()); 這裡behaviorTrace為空了,目前不知道原因
//        String funcName = behaviorTrace.value();


        //一般可以寫入資料庫
        Log.d("BehaviorAspect", String.format("%s功能被執行, 耗時: %d", "", duration));


        return null;
    }
}


BehaviorTrace.java
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.METHOD)
public @interface BehaviorTrace {
    String value();
}


感覺一下是不是很巧妙


參考地址:http://blog.csdn.net/hpc19950723/article/details/71250514

程式碼地址:https://github.com/firsthubgit/AspectjSimpleUse

注意配置gradle