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;
}