AspectJ(Aop)的使用想法
最近在阅读其他人的博客的时候,对AspectJ的出现感觉太好使,它作为SpringBoot的全家桶中一员,可以给Java后端同学打印日志等等功能都很方便,而且在实际代码编写中入侵性很少,而且Android项目也有java代码开发的完全可以使用AspectJ,关于一些方法的定位、耗时等等都很方便,最主要的是真的代码量很少,感觉很有意思
AspectJ(Aop)使用后具体细节
在看完上文使用Aop切面编程后,自己实际操作后发现,此方法不适用于有kotlin源码使用,否则在项目编译时,就无法通过,在java代码中使用后,在编译后,会在build-intermediates-classes-debug中看到通过静态编译后生成的标注方法的类,自定义的切面工具类,还有自定义的注解
使用自定义注解方法类
可以看到我们在编译项目的时候,通过AspectJ编译器,把使用自定义注解方法类,添加了静态代码块ajc$preClinit(),然后在可以看到在标注的方法中多出了调用before、around、after、afterReturning、afterThrowing这些方法
自定义切面类
在切面工具类中也自动生成静态代码块ajc$postClinit()和两个静态方法aspectOf()、hasAspect()
自定义注解
其中ajc$preClinit()通过反编译,发现初始化Factory,并把自定义的注解标记的方法中的能查出的关键的属性值传递进去
在调用test方法通过Factory.makeJp()方法获取节点,然后在调用TestAnnoAspect.aspectOf()方法中,静态代码块先初始化ajc$postClinit()
然后调用test_aroundBody1$advice()方法
所以关于使用AspectJ自定义注解,然后通过切面类去实现一些log、埋点等等功能非常方便