我是靠谱客的博主 可耐戒指,最近开发中收集的这篇文章主要介绍android AOP面向切面AspectJX框架配合使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

AspectJX不会配置的话可前往

CSDNicon-default.png?t=L892https://mp.csdn.net/mp_blog/creation/editor/120344428

1.登录AOP注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsLogin {
    String value();
}

切入点处理

@Aspect
public class BehaviorTraceAspect {
 
    @Pointcut("execution(@com.example.administrator.aoptest.annotation.IsLogin *  *(..))")
    public void methodAnnottatedWithBehaviorTrace() {
    }
 
    @Around("methodAnnottatedWithBehaviorTrace()")
    public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        Context context= (Context) joinPoint.getThis();
        if (SettingsPerf.getLonginStatus(context)){//判断是否登录,登录成功执行MainAcitity onClick 中的跳转
            Object result = joinPoint.proceed();  //执行注解的方法
            return  result;
        }else {//没有登录,不去执行注解的方法
            Intent intent=new Intent(context,LoginActivity.class);
            context.startActivity(intent);
            return null;
        }
    }
 
}

@Pointcut 是切入 点 , 所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义  

     execution(@com.example.administrator.aoptest.annotation.IsLogin * *(..))"  

     表示com.example.administrator.aoptest.annotation 包下所有注解了 IsLogin  的类的方法,进行拦截。

@Around   环绕通知, 在目标执行中执行通知, 控制目标执行时机  ,相对应的还有@Before,@After

使用注解

public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    @IsLogin("登录")
    public void onClick(View view) {
        Intent intent=new Intent(this,UserCenterActivity.class);
        startActivity(intent);
    }
}

2.防重点击AOP

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SingleClick {

    /**
     * 快速点击的间隔
     */
    long value() default 1000;
}

切入点处理

@Aspect
public class SingleClickAspect {

    /**
     * 最近一次点击的时间
     */
    private long mLastTime;
    /**
     * 最近一次点击的控件ID
     */
    private int mLastId;

    /**
     * 方法切入点(改变成自己的包名)
     */
    @Pointcut("execution(@com.hjq.demo.aop.SingleClick * *(..))")
    public void method() {}

    /**
     * 在连接点进行方法替换
     */
    @Around("method() && @annotation(singleClick)")
    public void aroundJoinPoint(ProceedingJoinPoint joinPoint, SingleClick singleClick) throws Throwable {
        View view = null;
        for (Object arg : joinPoint.getArgs()) {
            if (arg instanceof View) {
                view = (View) arg;
            }
        }
        if (view != null) {
            long currentTime = Calendar.getInstance().getTimeInMillis();
            if (currentTime - mLastTime < singleClick.value() && view.getId()
                    == mLastId) {
                Log.i("SingleClick", "发生快速点击");
                return;
            }
            mLastTime = currentTime;
            mLastId = view.getId();
            //执行原方法
            joinPoint.proceed();
        }
    }
}

用法

    @SingleClick
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.iv_crash_info:
                mDrawerLayout.openDrawer(GravityCompat.START);
                break;
         
      }
  }

最后

以上就是可耐戒指为你收集整理的android AOP面向切面AspectJX框架配合使用的全部内容,希望文章能够帮你解决android AOP面向切面AspectJX框架配合使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部