Android—AspectJ实践
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实践相关推荐
- android aspectj 参数,在Android项目中使用AspectJ
什么是AOP AOP是 Aspect Oriented Programming 的缩写,即面向切面编程,和日常遇到的面向对象OOP编程不同的是,OOP是将功能模块化对象化,AOP是针对同一类的问题统一 ...
- Xamarin.Android开发实践(十七)
Xamarin.Android开发实践(十七) 原文:Xamarin.Android开发实践(十七) Xamarin.Android之定位 一.前言 打开我们手中的应用,可以发现越来越多的应用使用了定 ...
- Android最佳性能实践(二)——分析内存的使用情况
由于Android是为移动设备开发的操作系统,我们在开发应用程序的时候应当始终把内存问题充分考虑在内.虽然Android系统拥有垃圾自动回收机制,但这并不意味着我们就可以完全忽略何时去分配或释放内存. ...
- Android最佳性能实践(一):合理管理内存
原文出处::http://blog.csdn.net/guolin_blog/article/details/42238627 系列阅读 Android最佳性能实践(一):合理管理内存 Android ...
- fir.im Weekly - 2016 年 Android 最佳实践列表
2016 年已经过去一半,你在年初制定的成长计划都实现了吗? 学海无涯,技术成长不是一簇而就的事情.本期 fir.im Weekly 推荐 王下邀月熊_Chevalier的 我的编程之路--知识管理与 ...
- React Native在Android当中实践(五)——常见问题
React Native在Android当中实践(一)--背景介绍 React Native在Android当中实践(二)--搭建开发环境 React Native在Android当中实践(三)--集 ...
- Android 路由实践(二)
前言 继上一篇Android 路由实践(一)之后,断更已经差不多一个月,毕竟是年前的最后一个月,各种事情扎堆,直到近几天才稍微闲下来,于是有了此文.简单回顾下,上一篇文章中简单介绍了三种实现路由的方式 ...
- Xamarin.Android开发实践(十四)
原文:Xamarin.Android开发实践(十四) Xamarin.Android之ListView和Adapter 一.前言 如今不管任何应用都能够看到列表的存在,而本章我们将学习如何使用Xama ...
- android系统功耗优化(2)---Android最佳实践之性能 - 电池续航时间优化
Android最佳实践之性能 - 电池续航时间优化 Doze和App Standby的优化(API23) 参考地址:http://developer.android.com/training/moni ...
最新文章
- 今天教你用 Python调用两个机器人聊天
- 这个牛逼技术你可千万别学!
- mysql 全文检索 教程_MySQL:详细说明MySQL全文检索图文详细教程
- linux网络编程-----TCP连接及相关问题
- android 加载显示富文本——TextView显示富文本和WebView显示富文本,WebView显示图片适配屏幕宽度
- 【值得学习】售前工程师的成长(四)---一个老员工的经验之谈
- 知识融合(实体对齐)笔记
- php 替换数字和字母,php preg_替换非字母数字字符并选择连词,然后拆分
- 如何看待B站疑似源码泄漏的问题?
- 通过有向图的可达矩阵判断有向图的连通类型
- java编写九宫格拼图游戏_jquery 九宫格拼图游戏源码
- 中国正从法律入手编织公民信息保护网
- 对JS中this的理解
- 【学习笔记】神经内科常用量表总结(文后有下载链接)
- ​电脑公司 GhostXP SP3装机版v2011.02(FAT32)
- 802.11ac物理层
- 用html语言编写笑脸,怎么使用HTML5中的Canvas绘制笑脸
- 【vue】在vue,vue cli中拼接字符串,拼接图片链接
- 【2389. 和有限的最长子序列】
- 终于有人把TCP/IP讲的明明白白了,搞懂真的不难,只需要看这一篇就够了
热门文章
- java地图点线面_openlayers之点,线,面(以城市,河流,省份为例,分别对应点线面)...
- redis源码分析 ppt_Redis源码分析之客户端+数据库
- php joomla,基于MySQL / PHP和Joomla的因特网管理信息系统设计
- ROracle Mysql_ROracle包查询数据库中文乱码
- a标签跳转后关闭当前页面_微信小程序2020-day-2 导航项目(跳转三种形态)
- python从视频中提取音频_提取视频中的音频——python三行程序搞定!
- DataTable的Merge\COPY\AcceptChange使用说明
- runloop - CFRunLoopObserverRef
- 2017南宁现场赛E 存档
- getElementById()方法取值