Aspectj简单使用(一)

本文介绍如何使用AspectJ进行切面编程,通过实例展示如何统计不同方法的运行时间,减少重复代码,提高代码维护效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/hpc19950723/article/details/71250514

代码地址:https://github.com/firsthubgit/AspectjSimpleUse

注意配置gradle



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值