AOP虽然是方法论,但就好像OOP中的Java一样,一些先行者也开发了一套语言来支持AOP。目前用得比较火的就是AspectJ了,它是一种几乎和Java完全一样的语言,而且完全兼容Java(AspectJ应该就是一种扩展Java,但它不是像Groovy[1]那样的拓展。)。当然,除了使用AspectJ特殊的语言外,AspectJ还支持原生的Java,只要加上对应的AspectJ注解就好。所以,使用AspectJ有两种方法:

完全使用AspectJ的语言。这语言一点也不难,和Java几乎一样,也能在AspectJ中调用Java的任何类库。AspectJ只是多了一些关键词罢了。
或者使用纯Java语言开发,然后使用AspectJ注解,简称*@AspectJ*。
AspectJ的配置可以参考另一篇文章Android中使用AspectJ详解
Join Points介绍
Join Points是AspectJ中的一个关键概念。Join Points可以看作是程序运行时的一个执行点,比如:一个函数的调用可以看作是个Join Points,如Log.e()这个函数,e()可以看作是个Join Points,而调运e()的函数也可以认为是一个Join Points;设置一个变量,或者读取一个变量也可以是个Join Points;for循环也可以看作是Join Points。
理论上说,一个程序中很多地方都可以被看做是Join Points,但是AspectJ中,只有下面所示的几种执行点被认为是Join Points:
| Join Points | 说明 | 示例 |
|---|---|---|
| method call | 函数调用 | 比如调用Log.e(),这是一处JPoint |
| method execution | 函数执行 | 比如Log.e()的执行内部,是一处Join Points。注意它和method call的区别。method call是调用某个函数的地方。而execution是某个函数执行的内部。 |
| constructor call | 构造函数调用 | 和method call类似 |
| constructor execution | 构造函数执行 | 和method execution类似 |
| field get | 获取某个变量 | 比如读取DemoActivity.debug成员 |
| field set | 设置某个变量 | 比如设置DemoActivity.debug成员 |
| pre-initialization | Object在构造函数中做得一些工作。 | |
| initialization | Object在构造函数中做得工作 | |
| static initialization | 类初始化 | 比如类的static{} |
| handler | 异常处理 | 比如try catch(xxx)中,对应catch内的执行 |
| advice execution | 这个是AspectJ的内容,稍后再说 |
这里列出了AspectJ所认可的JoinPoints的类型。实际上,也就是你想把新的代码插在程序的哪个地方,是插在构造方法中,还是插在某个方法调用前,或者是插在某个方法中,这个地方就是Join Points,当然,不是所有地方都能给你插的,只有能插的地方,才叫Join Points。
Pointcuts介绍
一个程序会有多个Join Points,即使同一个函数,也还分为call和execution类型的Join Points,但并不是所有的Join Points都是我们关心的,Pointcuts就是提供一种使得开发者能够选择自己需要的JoinPoints的方法。
Advice
Advice就是我们插入的代码以何种方式插入,有Before还有After、Around。
看个例子
@Before("execution(* android.app.Activity.on**(..))")
public void onActivityMethodBefore(JoinPoint joinPoint) throws Throwable {
}
这里会分成几个部分,我们依次来看:
Before和After其实还是很好理解的,也就是在Pointcuts之前和之后,插入代码,那么Around呢,从字面含义上来讲,也就是在方法前后各插入代码,是的,他包含了Before和After的全部功能,代码如下:
@Around("execution(* com.xys.aspectjxdemo.MainActivity.testAOP())")
public void onActivityMethodAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
String key = proceedingJoinPoint.getSignature().toString();
Log.d(TAG, "onActivityMethodAroundFirst: " + key);
proceedingJoinPoint.proceed();
Log.d(TAG, "onActivityMethodAroundSecond: " + key);
}
其中,proceedingJoinPoint.proceed()代表执行原始的方法,在这之前、之后,都可以进行各种逻辑处理。
自定义Pointcuts
自定义Pointcuts可以让我们更加精确的切入一个或多个指定的切入点。
首先我们要定义一个注解类
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
public @interface DebugTrace {
}
在需要插入代码的地方加入这个注解。如在MainActivity中加入,
public class MainActivity extends AppCompatActivity {
final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
logTest();
}
@DebugTrace
public void logTest() {
Log.e(TAG, "log test");
}
}
最后,创建切入代码
@Pointcut("execution(@com.kun.aspectjtest.aspect.DebugTrace * *..*.*(..))")
public void DebugTraceMethod() {}
@Before("DebugTraceMethod()")
public void beforeDebugTraceMethod(JoinPoint joinPoint) throws Throwable {
String key = joinPoint.getSignature().toString();
Log.e(TAG, "beforeDebugTraceMethod: " + key);
}
log如下
在AspectJ的切入点表达式中,我们前面都是使用的execution,实际上,还有一种类型——call,那么这两种语法有什么区别呢,对于Call来说:
Call(Before)
Pointcut{
Pointcut Method
}
Call(After)
对于Execution来说:
Pointcut{
execution(Before)
Pointcut Method
execution(After)
}
withincode
这个语法通常来进行一些切入点条件的过滤,作更加精确的切入控制。如下
public class MainActivity extends AppCompatActivity {
final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
aspectJ1();
aspectJ2();
aspectJ3();
}
public void aspectJTest() {
Log.e(TAG, "execute aspectJTest");
}
public void aspectJ1(){
aspectJTest();
}
public void aspectJ2(){
aspectJTest();
}
public void aspectJ3(){
aspectJTest();
}
}
aspectJ1(),aspectJ2(),aspectJ3()都调用了aspectJTest方法,但只想在aspectJ2调用aspectJTest时插入代码,这个时候就需要使用到Pointcut和withincode组合的方式,来精确定位切入点。
@Pointcut("(call(* *..aspectJTest()))&&withincode(* *..aspectJ2())")
public void invokeAspectJTestInAspectJ2() {
}
@Before("invokeAspectJTestInAspectJ2()")
public void beforeInvokeaspectJTestInAspectJ2(JoinPoint joinPoint) throws Throwable {
Log.e(TAG, "method:" + getMethodName(joinPoint).getName());
}
private MethodSignature getMethodName(JoinPoint joinPoint) {
if (joinPoint == null) return null;
return (MethodSignature) joinPoint.getSignature();
}
log如下
04-02 23:44:40.681 12107-12107/ E/MainActivity: execute aspectJTest 04-02 23:44:40.681 12107-12107/ E/AspectTest: method:aspectJTest 04-02 23:44:40.681 12107-12107/ E/MainActivity: execute aspectJTest 04-02 23:44:40.681 12107-12107/ E/MainActivity: execute aspectJTest
以上就是Aspecj的基本使用方法,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# aspectj
# 在Android项目中使用AspectJ的方法
# AndroidStudio 配置 AspectJ 环境实现AOP的方法
# Spring Aop之AspectJ注解配置实现日志管理的方法
# Android AOP框架AspectJ使用详解
# 分析java 中AspectJ切面执行两次的原因
# Android中使用AspectJ详解
# 详解Spring Aop实例之AspectJ注解配置
# Spring使用AspectJ注解和XML配置实现AOP
# java基于AspectJ(面向切面编程)编码示例分享
# Spring AOP AspectJ使用及配置过程解析
# 关键词
# 是个
# 插在
# 都是
# 几个
# 是在
# 也就
# 多个
# 做得
# 自定义
# 是一个
# 这是
# 很好
# 会有
# 给你
# 出了
# 你可以
# 第一个
# 让我们
# 在这
相关文章:
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
如何选择可靠的免备案建站服务器?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
如何用美橙互联一键搭建多站合一网站?
宁波自助建站系统如何快速打造专业企业网站?
大型企业网站制作流程,做网站需要注册公司吗?
,网站推广常用方法?
北京网站制作的公司有哪些,北京白云观官方网站?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
网站代码制作软件有哪些,如何生成自己网站的代码?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
宝塔Windows建站如何避免显示默认IIS页面?
手机网站制作与建设方案,手机网站如何建设?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
宁波免费建站如何选择可靠模板与平台?
如何通过建站之星自助学习解决操作问题?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
高防服务器租用指南:配置选择与快速部署攻略
宿州网站制作公司兴策,安徽省低保查询网站?
图册素材网站设计制作软件,图册的导出方式有几种?
建站DNS解析失败?如何正确配置域名服务器?
如何用已有域名快速搭建网站?
建站之星后台密码如何安全设置与找回?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
建站之星下载版如何获取与安装?
如何快速生成可下载的建站源码工具?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
如何在万网自助建站中设置域名及备案?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
建站之星如何修改网站生成路径?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
文字头像制作网站推荐软件,醒图能自动配文字吗?
企业微网站怎么做,公司网站和公众号有什么区别?
设计网站制作公司有哪些,制作网页教程?
建站10G流量真的够用吗?如何应对访问高峰?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
营销式网站制作方案,销售哪个网站招聘效果最好?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
如何用虚拟主机快速搭建网站?详细步骤解析
Swift开发中switch语句值绑定模式
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
北京专业网站制作设计师招聘,北京白云观官方网站?
香港服务器租用每月最低只需15元?
威客平台建站流程解析:高效搭建教程与设计优化方案
建站之星后台密码遗忘如何找回?
如何快速搭建个人网站并优化SEO?
教学网站制作软件,学习*后期制作的网站有哪些?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
官网网站制作腾讯审核要多久,联想路由器newifi官网
*请认真填写需求信息,我们会在24小时内与您取得联系。