Android中使用AspectJ
来源:互联网 发布:数据库嵌套not exists 编辑:程序博客网 时间:2024/05/23 19:13
aop学习 深入理解Android之AOP
什么是AOP
AOP是Aspect Oriented Programming的缩写,即『面向切面编程』。它和我们平时接触到的OOP都是编程的不同思想,OOP,即『面向对象编程』,它提倡的是将功能模块化,对象化,而AOP的思想,则不太一样,它提倡的是针对同一类问题的统一处理,当然,我们在实际编程过程中,不可能单纯的安装AOP或者OOP的思想来编程,很多时候,可能会混合多种编程思想,大家也不必要纠结该使用哪种思想,取百家之长,才是正道。
那么AOP这种编程思想有什么用呢,一般来说,主要用于不想侵入原有代码的场景中,例如SDK需要无侵入的在宿主中插入一些代码,做日志埋点、性能监控、动态权限控制、甚至是代码调试等等。
AspectJ
AspectJ实际上是对AOP编程思想的一个实践,当然,除了AspectJ以外,还有很多其它的AOP实现,例如ASMDex,但目前最好、最方便的,依然是AspectJ。
在Android项目中使用AspectJ
在android中配置aspectj是特别麻烦的,尝试在android studio中直接配置aspectj,折腾了半天没有成功,就放弃了,还好github上有个开源的sdkhttps://github.com/HujiangTechnology/gradle_plugin_android_aspectjx,可以直接拿来用,很方便。
接入说明
在项目的根目录的build.gradle文件中添加依赖,修改后文件如下
repositories { jcenter()}dependencies { classpath 'com.android.tools.build:gradle:2.3.0' classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.8' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files}
然后在项目或者库的build.gradle文件中添加AspectJ的依赖
compile 'org.aspectj:aspectjrt:1.8.9'
同时在该文件中加入AspectJX模块
apply plugin: 'android-aspectjx'
aspectjx默认会遍历项目编译后所有的.class文件和依赖的第三方库去查找符合织入条件的切点,为了提升编译效率,可以加入过滤条件指定遍历某些库或者不遍历某些库。
includeJarFilter和excludeJarFilter可以支持groupId过滤,artifactId过滤,或者依赖路径匹配过滤
aspectjx { //织入遍历符合条件的库 includeJarFilter 'universal-image-loader', 'AspectJX-Demo/library' //排除包含‘universal-image-loader’的库 excludeJarFilter 'universal-image-loader'}
使用
创建一个AspectTest的类,
@Aspectpublic class AspectTest { final String TAG = AspectTest.class.getSimpleName(); @Before("execution(* *..MainActivity+.on**(..))") public void method(JoinPoint joinPoint) throws Throwable { MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); String className = joinPoint.getThis().getClass().getSimpleName(); Log.e(TAG, "class:" + className); Log.e(TAG, "method:" + methodSignature.getName()); }}
MainActivty的代码如下
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }}
log如下
通过build之后会生成一个aspected.jar的文件
反编译这个jar,会发现它在MainActivity的onCreate中插入了几行代码。
作者:vonnie
链接:http://www.jianshu.com/p/e152b34b785b
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- Android中使用AspectJ
- Android中使用AspectJ
- 使用AspectJ在Android中实现Aop
- androidStudio中使用 AspectJ
- spring项目中使用Aspectj
- Aspectj中@args使用误解
- 在eclipse中使用Aspectj
- Spring中使用AspectJ指示器
- Spring中使用AspectJ指示器
- SpringAop中使用@AspectJ注解
- AspectJ使用过程中问题及解决办法
- Spring中使用AspectJ实现AOP
- AndroidStudio中 AspectJ 基础使用 简介
- android 使用AspectJ,代码无法正常注入到依赖项目中
- Android中AOP实践之三AspectJ解析篇
- 在Android Studio 配置AspectJ环境,与简单使用。
- AspectJ切点表达式语言中“&&”与“and”的使用场景
- 理一理Spring MVC中使用AspectJ的异常
- JSONArray和List转换
- uboot环境变量中几种启动方式解析
- 导航部分选中的背景跟随鼠标滑动
- 用python6行代码实现微信机器人
- CSS垂直居中几种方法
- Android中使用AspectJ
- Javaweb学习路线
- 天天学Linux命令16--tail命令
- studio二级列表查询
- select distinct 语句
- ZYNQ中的QSPI FLASH烧写问题
- AspectJ基本用法
- PHP源码之数组的内部实现
- android里更新数据量比较大时的批量处理方法