Android AOP二三事:使用AspectJ增加登录校验

AspectJ是一种严格意义上的AOP插件,因为它提供了完整的面向切面编程的注解,让使用者可以在不关心字节码原理的基础上完成代码的织入。

AspectJ实现代码织入有两种方式

  1. 自定编写.ajc文件
  2. 使用AspectJ提供的注解

两者最终都是通过ajc编译器完成代码的织入

常用语法

常用语法使用例子
Join Point连接点,表示可织入代码的点Field get读取属性
Field set写入属性等
PointCut具体的切入点比如调用Animal的fly方法 @Pointcut(“call(* xx.Animal.fly(…))”)
Advice代码织入位置@ before 切入点前织入 @After 切入点后织入

增加登录校验

依赖参考
https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
这是一个仿照hugo的android的aspectj库。

1.新建注解

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

2.增加切面处理

@Aspect
public class LoginCheckAspect {

    /**
     * 切面处理的点
     * * * (..) 可以处理所有的方法
     */
    @Pointcut("execution(@com.xx.LoginCheck * * (..))")
    public void LoginCheck() {
    }

    /**
     * 处理切面
     */
    @Around("LoginCheck()")
    public void aroundLoginCheck(final ProceedingJoinPoint joinPoint) throws Throwable {
        LoginCheckManager.log("aroundLoginCheck");
        Signature signature = joinPoint.getSignature();
        if (!(signature instanceof MemberSignature)) {
            throw new RuntimeException("该注解仅用于方法");
        }

        if (signature == null) {
            return;
        }
        MethodSignature methodSignature = (MethodSignature) signature;
        if (methodSignature.getMethod() == null) {
            return;
        }
        LoginCheck loginCheck = methodSignature.getMethod().getAnnotation(LoginCheck.class);
        if (loginCheck == null) {
            return;
        }

        if (!isLogin()) {
            jump2Login();
        } else {
            joinPoint.proceed();
        }
    }
}

3.为需要登录判断的方法增加注解

	@LoginCheck
    public static void jump2SomePage() {
       // xxx
    }

需要注意的是,如果项目配置了混淆,需要增加混淆配置

-keepclassmembers class * {
    @com.xx.LoginCheck <methods>;
}

如果内部类的方法,此混淆不支持,比如给View设置OnClick,如果给OnClick增加了注解,依旧会被混淆,所以需要配置@keep防止混淆

view.setOnClickListener(new OnClickListener() {
	@Keep
	@LoginCheck
	@Override
	public void onClick(View v) {
	}
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值