为什么80%的码农都做不了架构师?>>>   

参考文章:

  1. 使用AspectJ在Android中实现Aop
  2. 深入理解Android之AOP
  3. 自动打印日志

主要知识点:

  1. 主要是JPoint、pointcuts、advice以及他们之间的关系
  2. 可以通过aj文件、或@AspectJ注解的Java文件实现
  3. AspectJ和其他模块交互
  4. 重载方法会多次调用,需要用within限制是基类还是子类。

案例代码,实现自动化埋点:改自gradle-android-aspectj-plugin:

activity_my.xml

<com.uphyca.gradle.android.aspectj.CLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/root"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical"android:clickable="true"tools:context=".MyActivity"><TextViewandroid:id="@+id/greeting"android:layout_width="wrap_content"android:layout_height="100dp"android:gravity="center"/><TextViewandroid:id="@+id/greeting1"android:layout_width="wrap_content"android:layout_height="100dp"android:layout_below="@id/greeting"android:text="click me"android:gravity="center"/><TextViewandroid:id="@+id/greeting2"android:layout_width="wrap_content"android:layout_height="100dp"android:layout_below="@id/greeting1"android:text="click me"android:gravity="center"/></com.uphyca.gradle.android.aspectj.CLinearLayout>

MyActivity.java

public class MyActivity extends AppCompatActivity implements View.OnClickListener{@InjectGreeter greeter;private View.OnClickListener clickListener = new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.i("aaaaaaaaaaaa", "AppCompatActivity.clickListener");}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);((MyApplication) getApplication()).getComponent().inject(this);setContentView(R.layout.activity_my);TextView.class.cast(findViewById(R.id.greeting)).setText(greeter.greet());TextView.class.cast(findViewById(R.id.greeting)).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {doActivityKisClick(v);}});TextView.class.cast(findViewById(R.id.greeting1)).setOnClickListener(this);TextView.class.cast(findViewById(R.id.greeting2)).setOnClickListener(clickListener);init();}private void init(){Log.i("aaaaaaaaaaaa", "init");}private void doActivityKisClick(View v){Log.i("aaaaaaaaaaaa", "doActivityKisClick");}@Overridepublic void onClick(View v) {Log.i("aaaaaaaaaaaa", "MyActivity.onClick");}
}

MyAspect.aj

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;public aspect MyAspect {pointcut callGreet() : call(String com.uphyca.gradle.android.aspectj.Greeter+.greet());pointcut callInit() : call(private void com.uphyca.gradle.android.aspectj.MyActivity.init());/* 不管是匿名OnClickListener还是Activity implements方式,包括Activity、Fragment、自定义View中,都可以匹配*/pointcut callClick(android.view.View v) : execution(* android.view.View.OnClickListener.onClick(..)) && args(v);/* callClick也匹配了*/pointcut callDoClick(android.view.View v) : call(private void com.uphyca.gradle.android.aspectj.MyActivity.doActivityKisClick(android.view.View)) && target(com.uphyca.gradle.android.aspectj.MyActivity) && args(v);/* callClick也匹配了*/pointcut doCLayoutClick(android.view.View v) : call(private void com.uphyca.gradle.android.aspectj.CLinearLayout.doCKisClick(android.view.View)) && target(com.uphyca.gradle.android.aspectj.CLinearLayout) && args(v);/* 匹配所有KisClick结尾的事件, public/private/protect,以及static/final属于可选项。如果不设置它们,则默认都会选择,不需要用*代替 */pointcut doAllClick(android.view.View v) : call(* *.*KisClick(android.view.View)) && args(v);String around() : callGreet() {String result = proceed();return result.replace("world", "aspect");}before() : callInit() {android.util.Log.i("aaaaaaaaaaaa", "callInit");}before(android.view.View v) : callClick(v) {android.util.Log.i("aaaaaaaaaaaa", "callClick");}before(android.view.View v) : callDoClick(v) {android.util.Log.i("aaaaaaaaaaaa", "callDoClick");}before(android.view.View v) : doCLayoutClick(v) {android.util.Log.i("aaaaaaaaaaaa", "doCLayoutClick");}before(android.view.View v) : doAllClick(v) {org.aspectj.lang.Signature signature = thisJoinPoint.getSignature();String typeName = signature.getDeclaringTypeName();String methodName = signature.getName();android.util.Log.i("aaaaaaaaaaaa", "DeclaringTypeName: " + typeName + "." + methodName);}
}

CLinearlayout.java

public class CLinearLayout extends LinearLayout{public CLinearLayout(Context context) {this(context, null);}public CLinearLayout(Context context, AttributeSet attrs) {super(context, attrs);setOrientation(VERTICAL);setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {doCKisClick(v);doCSecondKisClick(v);}});}private void doCKisClick(View v){Log.i("aaaaaaaaaaaa", "CLinearLayout.click");}private void doCSecondKisClick(View v){Log.i("aaaaaaaaaaaa", "CLinearLayout.doCSecondKisClick");}}

转载于:https://my.oschina.net/bruces/blog/759962

AOP之AspectJ简单使用相关推荐

  1. 比较Spring AOP与AspectJ

    本文翻译自博客Comparing Spring AOP and AspectJ 介绍 如今有多个可用的AOP库,这些组件需要回答一系列的问题: 是否与我现有的应用兼容? 我在哪实现AOP? 集成到我的 ...

  2. 比较分析 Spring AOP 和 AspectJ 之间的差别

    面向方面的编程(AOP) 是一种编程范式,旨在通过允许横切关注点的分离,提高模块化.AOP提供方面来将跨越对象关注点模块化.虽然现在可以获得许多AOP框架,但在这里我们要区分的只有两个流行的框架:Sp ...

  3. Spring AOP 简介以及简单用法

    Spring AOP 简介以及简单用法 如果你去面试java开发, 那么Spring的AOP和DI几乎是必问的问题. 那么AOP是什么呢? 一. AOP 所谓Aop就是 Aspect-Oriented ...

  4. aopaspect区别_面试官:什么是AOP?Spring AOP和AspectJ的区别是什么?

    AOP(Aspect Orient Programming),它是面向对象编程的一种补充,主要应用于处理一些具有横切性质的系统级服务,如日志收集.事务管理.安全检查.缓存.对象池管理等. AOP实现的 ...

  5. SpringAop与AspectJ的联系与区别____比较分析 Spring AOP 和 AspectJ 之间的差别

    SpringAop与AspectJ的联系与区别 区别 AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Ja ...

  6. 比较Spring AOP和AspectJ

    1. 介绍 当前有多个可用的AOP库,这些库必须能够回答许多问题: 它与我现有的或新的应用程序兼容吗? 在哪里可以实施AOP? 它与我的应用程序集成的速度有多快? 性能开销是多少? 在本文中,我们将着 ...

  7. 在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间

    原文链接:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 译 ...

  8. AOP的XML架构、AOP的@AspectJ

    AOP的XML架构 aop的xml架构例子:https://www.w3cschool.cn/wkspring/omps1mm6.html aop的@AspectJ例子:https://www.w3c ...

  9. 框架源码专题:Spring的Aop实现原理,Spring AOP 与 AspectJ 的关系

    文章目录 1. Spring AOP 与 AspectJ 的关系 2. JDK和Cglib动态代理的区别 3. Spring AOP应用案例 4. Spring AOP有几种配置方式? 5. Spri ...

最新文章

  1. 若依微服务版怎样修改Nacos中配置文件使Url不受权限认证跳过Token验证
  2. etc的常见算法_运用机器学习算法研究城市形态与户外温度之间的相关性
  3. 兼容 .NET Core3.0, Natasha 框架实现 隔离域与热编译操作
  4. 【转】Golang 关于通道 Chan 详解
  5. java开发大全、系列文章、精品教程
  6. PHP中获取html页面传值
  7. 自动化运维工具ansible的安装部署(图文详解!)
  8. redis 菜鸟教程笔记摘抄整理
  9. 《Linux 命令行大全》.pdf
  10. WICED™ SMART Software Development Kit
  11. gmod服务器文件,gmod服务器里改名字指令 | 手游网游页游攻略大全
  12. python计算2的n次方编写_python中n次方怎么表示
  13. 相敬如宾 你将获得更多敬重
  14. Flutter3.0导入english_words报错flutter\packages\flutter_tools\gradle\flutter.gradle‘ 行: 1156
  15. Alist+RaiDrive 给电脑整个80亿GB硬盘
  16. 用后羿采集器抓取文件并批量更改文件名
  17. 冒泡算法java代码实现
  18. python读取.data文件总结
  19. 拓扑绝缘体 量子计算机,物理所预言立方对称性破缺下的新型拓扑绝缘体材料...
  20. 怎样改变图片尺寸大小不变形?如何设置图片尺寸?

热门文章

  1. php 生成css文件怎么打开,php生成html文件的多种步骤介绍
  2. Linux内核设计与实现---页高速缓存和页回写
  3. nginx lua mysql 性能_深入浅出 nginx lua 为什么高性能
  4. VS2019使用NASM编译汇编文件
  5. 标准I/O小程序-文件拷贝
  6. pthread和互斥量条件变量函数意义速查表
  7. php一行多个商品,【后端开发】php一行展示多个商品怎么实现
  8. c++中的IO流(流的概念和流类库的结构,标准的输入输出流)
  9. 字符串函数参数传入传出(字符串反转)
  10. 装饰器3--装饰器作用原理