Aspectj简单使用(一)

来源:互联网 发布:数据库原理 第5版 pdf 编辑:程序博客网 时间:2024/06/06 01:30

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

@Aspectpublic 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



原创粉丝点击