博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AOP之AspectJ简单使用
阅读量:6248 次
发布时间:2019-06-22

本文共 4396 字,大约阅读时间需要 14 分钟。

  hot3.png

参考文章:

主要知识点:

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

案例代码,实现自动化埋点:改自:

activity_my.xml

MyActivity.java

public class MyActivity extends AppCompatActivity implements View.OnClickListener{    @Inject    Greeter greeter;    private View.OnClickListener clickListener = new View.OnClickListener() {        @Override        public void onClick(View v) {            Log.i("aaaaaaaaaaaa", "AppCompatActivity.clickListener");        }    };    @Override    protected 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() {            @Override            public 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");    }    @Override    public 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() {            @Override            public 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

你可能感兴趣的文章
湖北整治清退非法码头 为长江“留白增绿”
查看>>
为什么要把网站升级到HTTPS
查看>>
【Hello CSS】序章-起源
查看>>
转行IT要趁早,多迪教育新就业数据告诉你真相
查看>>
JavaScript深入之参数按值传递
查看>>
Fragment总结
查看>>
Flutter进阶:深入探究 ListView 和 ScrollPhysics
查看>>
深入了解virtual dom
查看>>
spring事物应该注意的地方
查看>>
浅析 Vue 2.6 中的 nextTick 方法
查看>>
一篇文章搞懂闭包。
查看>>
结合实际场景谈一谈微服务配置
查看>>
我的前端面试总结(套路篇)
查看>>
ApacheCN 学习资源汇总 2018.11
查看>>
数字滚动插件numberAnimate.js的使用及效果修改
查看>>
从JS引擎理解Await b()与Promise.then(b)的堆栈处理
查看>>
深度学习-初识
查看>>
十分钟理解Redux核心思想,过目不忘。
查看>>
非对称加密技术- RSA算法数学原理分析
查看>>
PHP学习记录(基础)
查看>>