本文仅仅作为笔记的形式来记录一下使用AspectJ遇到的坑。
某日,在帖子上看到Android中使用AspectJ的字眼,这玩意让我眼前一亮,于是便挪到项目中使用。主要用到的功能之一是:系统权限适配。挪进去之后,发现运行稳定。AspectJ是通过织入代码的方式,最终生成新的class文件,当时了解到这一点之后,就没有去想AspectJ在不同系统版本上的异同。于是便愉快地:打包,上线。
又是风和日丽的某日,尽管风和日丽,却接到一个晴天霹雳的消息。说是用户点击登录按钮时,程序闪退。咨询到用户手机型号为三星、Android系统版本为4.2。优先考虑系统版本的问题,赶紧创建一个4.2的虚拟机 -> 运行项目 -> 登录,结果发现,确实闪退了,抛了空指针异常,指向却是切片类中传入的注解实例。
看到如此结果,心下一惊。于是乎,打开编译后的class文件查看,到底是哪旮旯出了问题。于是我看到了下图:
这里还对var10002做了判空操作,当var10002==null时,则通过Class.getDeclearedMethod().getAnnotation()方法获取注解实例,该方法最终调用了Method的getAnnotationNative这个本地方法。于是本人对该方法做了测试,发现了很神奇的现象:
该getAnnotation()方法在Android 5.0以上是能获取到注解实例的,但是在Android 5.0以下则会返回null。
无可奈何花落去,最终我只能在切片类中加入了注解实例判空逻辑。直接让方法运行即可,反正6.0以下手机都不用做权限适配,不是吗?