android切面编程学习

buildscript {
    repositories {
        maven { url 'https://maven.google.com' }
        maven { url 'https://jitpack.io' }
        jcenter()
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath 'org.aspectj:aspectjtools:1.9.1'
        classpath 'org.aspectj:aspectjweaver:1.9.1'
    }
}
@Aspect
public class AspectTest {

    @Pointcut("execution(* phoenix.com.helloaspectj.MainActivity.**(..))")
    public void executeAspectJ() {
    } // 注意*号后面必须有空格

    @Before("executeAspectJ()")
    public void beforeAspectJ(JoinPoint joinPoint) throws Throwable  {
        Log.d(”tag“, "injected -> " + joinPoint.toShortString());
    }
    
 
 @Pointcut("execution(@com.xb.androidaoppermissionlibrary.libpermission.annotation.AspectFaceSign * *(..))")
    public void onAspectFaceSign() {

    }

    @Around("onAspectFaceSign() && @annotation(aspectFaceSign)")
    public void doAspectFaceSign(final ProceedingJoinPoint joinPoint, AspectFaceSign aspectFaceSign) throws Throwable {
  
    }
}

这里@PointCut注解后的参数表示的意思是对 MainActivity中的所有方法进行注入,参数用的是正则匹配语法。

 

Pointcuts 示例

以下示例表示在aspectjx插件下,相同包是指同一个aar/jar包,AspectJ常规配置下不同包不能执行“execution”织入

execution

execution(* com.howtodoinjava.EmployeeManager.*( .. ))
    匹配EmployeeManger接口中所有的方法
    execution(* EmployeeManager.*( .. ))
    当切面方法和EmployeeManager接口在相同的包下时,匹配EmployeeManger接口中所有的方法
    execution(public * EmployeeManager.*(..))
    当切面方法和EmployeeManager接口在相同的包下时,匹配EmployeeManager接口的所有public方法
    execution(public EmployeeDTO EmployeeManager.*(..))
    匹配EmployeeManager接口中权限为public并返回类型为EmployeeDTO的所有方法。
    execution(public EmployeeDTO EmployeeManager.*(EmployeeDTO, ..))
    匹配EmployeeManager接口中权限为public并返回类型为EmployeeDTO,第一个参数为EmployeeDTO类型的所有方法。
    execution(public EmployeeDTO EmployeeManager.*(EmployeeDTO, Integer))
    匹配EmployeeManager接口中权限为public、返回类型为EmployeeDTO,参数定义为EmployeeDTO,Integer的所有方法。
    "execution(@com.xyz.service.BehaviorTrace * *(..))"
    匹配注解为"@com.xyz.service.BehaviorTrace",返回值为任意类型,任意包名下的任意方法。

 

踩坑

1、切面类里面不能使用lamad表达式,否则会报错并且找不到原因。

2、在try catch里面不能使用“|”,搞到崩溃了。

           try {
                System.load(s1);
                //这样写一直不进切点方法,不知道为什么
            } catch (UnsatisfiedLinkError|Exception e) {
                e.printStackTrace();
                return false;
            }

          try {
                System.load(s1);
                //这样就行了
            } catch (UnsatisfiedLinkError e) {
                e.printStackTrace();
                return false;
            }

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值