AspectJ支持编译期和加载时代码注入

Advice(通知): 典型的 Advice 类型有 before、after 和 around,分别表示在目标方法执行之前、执行后和完全替代目标方法执行的代码。

Joint point(连接点): 程序中可能作为代码注入目标的特定的点和入口。

Pointcut(切入点): 告诉代码注入工具,在何处注入一段特定代码的表达式。

Aspect(切面): Pointcut 和 Advice 的组合看做切面。例如,在本例中通过定义一个 pointcut 和给定恰当的advice,添加一个了内存缓存的切面。

Weaving(织入): 注入代码(advices)到目标位置(joint points)的过程。

AspectJ环境配置:

1.配置gradle

根项目gradle:

classpath 'org.aspectj:aspectjtools:1.8.9'
classpath 'org.aspectj:aspectjweaver:1.8.9'

AsepctJ项目:

api 'org.aspectj:aspectjrt:1.8.13'import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Mainandroid.libraryVariants.all { variant ->JavaCompile javaCompile = variant.javaCompilejavaCompile.doLast {String[] args = ["-showWeaveInfo","-1.5","-inpath", javaCompile.destinationDir.toString(),"-aspectpath", javaCompile.classpath.asPath,"-d", javaCompile.destinationDir.toString(),"-classpath", javaCompile.classpath.asPath,"-bootclasspath", android.bootClasspath.join(File.pathSeparator)]MessageHandler handler = new MessageHandler(true)new Main().run(args, handler)def log = project.loggerfor (IMessage message : handler.getMessages(null, true)) {switch (message.getKind()) {case IMessage.ABORT:case IMessage.ERROR:case IMessage.FAIL:log.error message.message, message.thrownbreakcase IMessage.WARNING:case IMessage.INFO:log.info message.message, message.thrownbreakcase IMessage.DEBUG:log.debug message.message, message.thrownbreak}}}
}

如果直接在app的gradle中配置

implementation 'org.aspectj:aspectjrt:1.8.13'import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Mainfinal def variants = project.android.applicationVariants
variants.all { variant ->JavaCompile javaCompile = variant.javaCompilejavaCompile.doLast {String[] args = ["-showWeaveInfo","-1.5","-inpath", javaCompile.destinationDir.toString(),"-aspectpath", javaCompile.classpath.asPath,"-d", javaCompile.destinationDir.toString(),"-classpath", javaCompile.classpath.asPath,"-bootclasspath", android.bootClasspath.join(File.pathSeparator)]MessageHandler handler = new MessageHandler(true)new Main().run(args, handler)def log = project.loggerfor (IMessage message : handler.getMessages(null, true)) {switch (message.getKind()) {case IMessage.ABORT:case IMessage.ERROR:case IMessage.FAIL:log.error message.message, message.thrownbreakcase IMessage.WARNING:case IMessage.INFO:log.info message.message, message.thrownbreakcase IMessage.DEBUG:log.debug message.message, message.thrownbreak}}}
}

注意:在哪使用就需要在哪配置上面的一大段东西,网络上也有自定义Puglin进行组件化的操作,就不用每个都去设置,但是自己尝试了报错。

2.MianActivity代码

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.tv);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showToast();}});}private void showToast(){Toast.makeText(MainActivity.this,"aaaaaaaaaaa",Toast.LENGTH_SHORT).show();}
}

3.调用AspectJ

@Aspect
public class AspectJText {@Before("execution(* com.example.aspectjdemo.MainActivity.showToast(..))")public void show(JoinPoint joinPoint){Toast.makeText((Context) joinPoint.getThis(), "hhhhhh", Toast.LENGTH_SHORT).show();}final String TAG = AspectJText.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());}}

运行结果:

编译后文件:

 可以看到编译后的类文件出现了AspectJ动态加上的语句。

Android—AspectJ实践相关推荐

  1. android aspectj 参数,在Android项目中使用AspectJ

    什么是AOP AOP是 Aspect Oriented Programming 的缩写,即面向切面编程,和日常遇到的面向对象OOP编程不同的是,OOP是将功能模块化对象化,AOP是针对同一类的问题统一 ...

  2. Xamarin.Android开发实践(十七)

    Xamarin.Android开发实践(十七) 原文:Xamarin.Android开发实践(十七) Xamarin.Android之定位 一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定 ...

  3. Android最佳性能实践(二)——分析内存的使用情况

    由于Android是为移动设备开发的操作系统,我们在开发应用程序的时候应当始终把内存问题充分考虑在内.虽然Android系统拥有垃圾自动回收机制,但这并不意味着我们就可以完全忽略何时去分配或释放内存. ...

  4. Android最佳性能实践(一):合理管理内存

    原文出处::http://blog.csdn.net/guolin_blog/article/details/42238627 系列阅读 Android最佳性能实践(一):合理管理内存 Android ...

  5. fir.im Weekly - 2016 年 Android 最佳实践列表

    2016 年已经过去一半,你在年初制定的成长计划都实现了吗? 学海无涯,技术成长不是一簇而就的事情.本期 fir.im Weekly 推荐 王下邀月熊_Chevalier的 我的编程之路--知识管理与 ...

  6. React Native在Android当中实践(五)——常见问题

    React Native在Android当中实践(一)--背景介绍 React Native在Android当中实践(二)--搭建开发环境 React Native在Android当中实践(三)--集 ...

  7. Android 路由实践(二)

    前言 继上一篇Android 路由实践(一)之后,断更已经差不多一个月,毕竟是年前的最后一个月,各种事情扎堆,直到近几天才稍微闲下来,于是有了此文.简单回顾下,上一篇文章中简单介绍了三种实现路由的方式 ...

  8. Xamarin.Android开发实践(十四)

    原文:Xamarin.Android开发实践(十四) Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xama ...

  9. android系统功耗优化(2)---Android最佳实践之性能 - 电池续航时间优化

    Android最佳实践之性能 - 电池续航时间优化 Doze和App Standby的优化(API23) 参考地址:http://developer.android.com/training/moni ...

最新文章

  1. 今天教你用 Python调用两个机器人聊天
  2. 这个牛逼技术你可千万别学!
  3. mysql 全文检索 教程_MySQL:详细说明MySQL全文检索图文详细教程
  4. linux网络编程-----TCP连接及相关问题
  5. android 加载显示富文本——TextView显示富文本和WebView显示富文本,WebView显示图片适配屏幕宽度
  6. 【值得学习】售前工程师的成长(四)---一个老员工的经验之谈
  7. 知识融合(实体对齐)笔记
  8. php 替换数字和字母,php preg_替换非字母数字字符并选择连词,然后拆分
  9. 如何看待B站疑似源码泄漏的问题?
  10. 通过有向图的可达矩阵判断有向图的连通类型
  11. java编写九宫格拼图游戏_jquery 九宫格拼图游戏源码
  12. 中国正从法律入手编织公民信息保护网
  13. 对JS中this的理解
  14. 【学习笔记】神经内科常用量表总结(文后有下载链接)
  15. ​电脑公司 GhostXP SP3装机版v2011.02(FAT32)
  16. 802.11ac物理层
  17. 用html语言编写笑脸,怎么使用HTML5中的Canvas绘制笑脸
  18. 【vue】在vue,vue cli中拼接字符串,拼接图片链接
  19. 【2389. 和有限的最长子序列】
  20. 终于有人把TCP/IP讲的明明白白了,搞懂真的不难,只需要看这一篇就够了

热门文章

  1. java地图点线面_openlayers之点,线,面(以城市,河流,省份为例,分别对应点线面)...
  2. redis源码分析 ppt_Redis源码分析之客户端+数据库
  3. php joomla,基于MySQL / PHP和Joomla的因特网管理信息系统设计
  4. ROracle Mysql_ROracle包查询数据库中文乱码
  5. a标签跳转后关闭当前页面_微信小程序2020-day-2 导航项目(跳转三种形态)
  6. python从视频中提取音频_提取视频中的音频——python三行程序搞定!
  7. DataTable的Merge\COPY\AcceptChange使用说明
  8. runloop - CFRunLoopObserverRef
  9. 2017南宁现场赛E 存档
  10. getElementById()方法取值