Android中使用AspectJ详解

Android中使用AspectJ详解,第1张

概述什么是AOPAOP是AspectOrientedProgramming的缩写,即『面向切面编程』。它和我们平时接触到的OOP都是编程的不同思想,OOP,即『面向对象编程』,它提倡的是将功能模块化,对象化,而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如下

log

通过build之后会生成一个aspected.jar的文件

截图

反编译这个jar,会发现它在MainActivity的onCreate中插入了几行代码。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程小技巧!

总结

以上是内存溢出为你收集整理的Android中使用AspectJ详解全部内容,希望文章能够帮你解决Android中使用AspectJ详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1146418.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存