Android中使用AspectJ详解

作者:vonnie 时间:2022-01-29 19:12:05 

什么是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的类,


@Aspect
public 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如下

Android中使用AspectJ详解

log

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

Android中使用AspectJ详解

截图

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

来源:http://www.jianshu.com/p/e152b34b785b

标签:aspectj
0
投稿

猜你喜欢

  • 自定义视图view使用Canvas实现手写板和涂鸦功能

    2022-02-22 17:00:43
  • Android activity堆栈及管理实例详解

    2022-07-28 01:17:14
  • Java中try、catch的使用方法

    2021-11-08 00:48:12
  • Android实现一个完美的倒计时功能

    2022-04-12 11:28:02
  • java序列化与反序列化的使用方法汇总

    2022-02-27 14:47:25
  • WPF自定义选择年月控件详解

    2021-09-05 23:48:34
  • Android系统设置中的清除数据会清除哪些数据?

    2022-09-04 04:48:13
  • java自动生成ID号的方法

    2023-11-18 11:17:56
  • Android使用ItemTouchHelper实现侧滑删除和拖拽

    2021-12-18 20:00:40
  • Java接口的简单定义与实现方法示例

    2022-11-22 05:04:43
  • Kotlin基础教程之面向对象

    2023-06-21 19:54:36
  • Java String转换时为null的解决方法

    2022-08-25 08:16:00
  • SpringRetry重试框架的具体使用

    2022-09-21 00:37:35
  • springboot 同时启用http/https的配置方法

    2023-06-22 12:04:12
  • Java命令行下Jar包打包小结

    2023-01-04 19:25:44
  • java中Servlet程序下载文件实例详解

    2022-04-28 18:26:10
  • Android自定义输入法软键盘

    2023-04-20 05:51:54
  • 使用java实现各种数据统计图(柱形图,饼图,折线图)

    2022-03-09 22:12:50
  • c#测试反射性能示例

    2021-12-19 23:13:47
  • wenserver获取天气预报数据实例分享

    2021-07-22 14:22:52
  • asp之家 软件编程 m.aspxhome.com