AOP之AspectJ简单使用
为什么80%的码农都做不了架构师?>>>
参考文章:
- 使用AspectJ在Android中实现Aop
- 深入理解Android之AOP
- 自动打印日志
主要知识点:
- 主要是JPoint、pointcuts、advice以及他们之间的关系
- 可以通过aj文件、或@AspectJ注解的Java文件实现
- AspectJ和其他模块交互
- 重载方法会多次调用,需要用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简单使用相关推荐
- 比较Spring AOP与AspectJ
本文翻译自博客Comparing Spring AOP and AspectJ 介绍 如今有多个可用的AOP库,这些组件需要回答一系列的问题: 是否与我现有的应用兼容? 我在哪实现AOP? 集成到我的 ...
- 比较分析 Spring AOP 和 AspectJ 之间的差别
面向方面的编程(AOP) 是一种编程范式,旨在通过允许横切关注点的分离,提高模块化.AOP提供方面来将跨越对象关注点模块化.虽然现在可以获得许多AOP框架,但在这里我们要区分的只有两个流行的框架:Sp ...
- Spring AOP 简介以及简单用法
Spring AOP 简介以及简单用法 如果你去面试java开发, 那么Spring的AOP和DI几乎是必问的问题. 那么AOP是什么呢? 一. AOP 所谓Aop就是 Aspect-Oriented ...
- aopaspect区别_面试官:什么是AOP?Spring AOP和AspectJ的区别是什么?
AOP(Aspect Orient Programming),它是面向对象编程的一种补充,主要应用于处理一些具有横切性质的系统级服务,如日志收集.事务管理.安全检查.缓存.对象池管理等. AOP实现的 ...
- SpringAop与AspectJ的联系与区别____比较分析 Spring AOP 和 AspectJ 之间的差别
SpringAop与AspectJ的联系与区别 区别 AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Ja ...
- 比较Spring AOP和AspectJ
1. 介绍 当前有多个可用的AOP库,这些库必须能够回答许多问题: 它与我现有的或新的应用程序兼容吗? 在哪里可以实施AOP? 它与我的应用程序集成的速度有多快? 性能开销是多少? 在本文中,我们将着 ...
- 在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间
原文链接:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 译 ...
- AOP的XML架构、AOP的@AspectJ
AOP的XML架构 aop的xml架构例子:https://www.w3cschool.cn/wkspring/omps1mm6.html aop的@AspectJ例子:https://www.w3c ...
- 框架源码专题:Spring的Aop实现原理,Spring AOP 与 AspectJ 的关系
文章目录 1. Spring AOP 与 AspectJ 的关系 2. JDK和Cglib动态代理的区别 3. Spring AOP应用案例 4. Spring AOP有几种配置方式? 5. Spri ...
最新文章
- 若依微服务版怎样修改Nacos中配置文件使Url不受权限认证跳过Token验证
- etc的常见算法_运用机器学习算法研究城市形态与户外温度之间的相关性
- 兼容 .NET Core3.0, Natasha 框架实现 隔离域与热编译操作
- 【转】Golang 关于通道 Chan 详解
- java开发大全、系列文章、精品教程
- PHP中获取html页面传值
- 自动化运维工具ansible的安装部署(图文详解!)
- redis 菜鸟教程笔记摘抄整理
- 《Linux 命令行大全》.pdf
- WICED™ SMART Software Development Kit
- gmod服务器文件,gmod服务器里改名字指令 | 手游网游页游攻略大全
- python计算2的n次方编写_python中n次方怎么表示
- 相敬如宾 你将获得更多敬重
- Flutter3.0导入english_words报错flutter\packages\flutter_tools\gradle\flutter.gradle‘ 行: 1156
- Alist+RaiDrive 给电脑整个80亿GB硬盘
- 用后羿采集器抓取文件并批量更改文件名
- 冒泡算法java代码实现
- python读取.data文件总结
- 拓扑绝缘体 量子计算机,物理所预言立方对称性破缺下的新型拓扑绝缘体材料...
- 怎样改变图片尺寸大小不变形?如何设置图片尺寸?