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



猜你喜欢

转载自blog.csdn.net/u010232308/article/details/72842174