Android使用Aspectj
使用AspectJ
集成步骤:
1、AS配置Aspectj环境
2、配置使用ajc编译
4、定义注解
5、Aspect
6、使用
7、Example
AS配置Aspectj环境。Aspect目前最新版本为 1.8.10,AS中需要集成aspectjtool及aspectjrt并配置ajc编译,具体如下:
build.gradle(project)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:${GRADLE_VERSION}" classpath "org.aspectj:aspectjtools:${ASPECT_VERSION}"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
} allprojects {
repositories {
jcenter()
}
} task clean(type: Delete) {
delete rootProject.buildDir
}
build.gradle(app)
dependencies {
compile "org.aspectj:aspectjrt:${ASPECT_VERSION}"
}
android.libraryVariants.all { variant ->
LibraryPlugin plugin = project.plugins.getPlugin(LibraryPlugin)
JavaCompile javaCompile = variant.javaCompile
javaCompile.doLast {
String[] args = ["-showWeaveInfo",
"-1.5",
"-inpath", javaCompile.destinationDir.toString(),
"-aspectpath", javaCompile.classpath.asPath,
"-d", javaCompile.destinationDir.toString(),
"-classpath", javaCompile.classpath.asPath,
"-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)
]
def log = project.logger
log.error("aspectj", "----------------------aspect ajc args-------------------" + Arrays.toString(args))
MessageHandler handler = new MessageHandler(true);
new Main().run(args, handler)
for (IMessage message : handler.getMessages(null, true)) {
switch (message.getKind()) {
case IMessage.ABORT:
case IMessage.ERROR:
case IMessage.FAIL:
log.error message.message, message.thrown
break;
case IMessage.WARNING:
case IMessage.INFO:
log.info message.message, message.thrown
break;
case IMessage.DEBUG:
log.debug message.message, message.thrown
break;
}
}
}
}
定义注解
package com.xiaosw.aspectj.annotation; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* <p><br/>ClassName : {@link UserBehaviour}
* <br/>Description : 用户行为统计
* <br/>
* <br/>Author : xiaosw<xiaosw0802@163.com>
* <br/>Create date : 2017-03-21 11:11:16</p>
*/ @Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface UserBehaviour { String value() default ""; }
Aspect
package com.xiaosw.aspectj.aspacet; import android.util.Log; import com.xiaosw.aspectj.annotation.UserBehaviour; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import java.lang.reflect.Method; /**
* <p><br/>ClassName : {@link UserBehaviourAspacet}
* <br/>Description :
* <br/>
* <br/>Author : xiaosw<xiaosw0802@163.com>
* <br/>Create date : 2017-03-21 11:11:17</p>
*/ @Aspect
public class UserBehaviourAspacet { /** @see UserBehaviourAspacet#getClass().getSimpleName() */
private static final String TAG = "UserBehaviourAspacet";
// 任意类任意方法任意参数使用UserBehaivour注解
private static final String METHOD_INPUTCUT = "execution(@com.xiaosw.aspectj.annotation.UserBehaviour * *(..))";
// 任意类任意构造方法使用UserBehaivour注解
private static final String CONSTRUCTOR_INPUTCUT = "execution(@com.xiaosw.aspectj.annotation.UserBehaviour *.new(..))";
// 普通方法切点
@Pointcut(METHOD_INPUTCUT)
public void methodAnnotatedWithUserBehaviour() {}
// 构造方法切点
@Pointcut(CONSTRUCTOR_INPUTCUT)
private void constructorAnnotatedWithUserBehaviour() {} /**
* 同步方法不作为切点
*/
@Pointcut("execution(!synchronized * *(..))")
private void noSynchronized() {} // @Before("methodAnnotatedWithUserBehaviour() || constructorAnnotatedWithUserBehaviour()")
// public void callBefore() {
// Log.e(TAG, "callBefore()");
// }
//
// @After("methodAnnotatedWithUserBehaviour() || constructorAnnotatedWithUserBehaviour()")
// public void callAfter() {
// Log.e(TAG, "callAfter()");
// } // Advice
@Around("noSynchronized() && (methodAnnotatedWithUserBehaviour() || constructorAnnotatedWithUserBehaviour())")
public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = null;
Log.e(TAG, "weaveJoinPoint: ");
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
if (method.isAnnotationPresent(UserBehaviour.class)) {
UserBehaviour userBehaviour = method.getAnnotation(UserBehaviour.class);
Log.e(TAG, "weaveJoinPoint: parsms = " + userBehaviour.value());
result = joinPoint.proceed();
} else {
Log.e(TAG, "weaveJoinPoint: method not instaceof UserBehaviour.class");
}
return result;
} }
使用
@UserBehaviour("call testAop()")
private void testAop() {
Log.e(TAG, "call -----------------> testAop()");
}
Android使用Aspectj的更多相关文章
- Android使用AOP
这里不讲aop的概念,网上资料很多,这里只讲如何配置aop和自定义plugin. 1.使用场景 在android中,有些业务是公共的,例如:登录判断.获取权限.网络判断等一些公用的业务逻辑,这些都可以 ...
- AOP AspectJ 字节码 示例 Hugo MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- GOOGLE CODE ANDROID 开源项目 集合
转:http://blog.csdn.net/dellheng/article/details/7163333 1. ZXing http://code.google.com/p/zx ...
- android开源项目集合
ZXing http://code.google.com/p/zxing/ 条形码.二维码 K-9 Mail http://code.google.com/p/k9mail/ 邮件客户端 Sipdro ...
- AOP 面向切面编程
AOP http://blog.csdn.net/xiang_j2ee/article/details/6851963 Android 支持 AspectJ 这个库来实现面向切面编程. 使用 Apac ...
- 【原创】Android AOP面向切面编程AspectJ
一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...
- 在Android项目中使用AspectJ
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/8888459.html 什么是AOP AOP是 Aspec ...
- Android埋点方案的简单实现-AOP之AspectJ
个人博客 http://www.milovetingting.cn Android埋点方案的简单实现-AOP之AspectJ AOP的定义 AOP为Aspect Oriented Programmin ...
- Android app AOP添加埋点技术总结
目标:通过面向切面编程来实现对源代码无侵入的埋点. 方式 能力 缺点 学习曲线 XPosed 运行期hook 能hook自己应用进程的方法: 能hook别的应用的方法: 能hook系统方法 ...
随机推荐
- wince开发环境搭建与全套教程
http://www.cnblogs.com/zhchongyao/archive/2010/12/28/1919176.html http://blog.csdn.net/weiren2006/ar ...
- 微信小程序 引用其他js里的方法
微信小程序中,在微信官方开发文档我们可以知道 小程序的目录结构 . 一个小程序页面由四个文件组成,一个小程序页面的四个文件具有相同路径与文件名,由此我们可知一个小程序页面对应着一个跟页面同名的js文件 ...
- SQL SERVER将多行数据合并成一行(转载)
昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行 比如表中有两列数据 : ep_classes ep_name A ...
- iOS获取本地时间
NSDate *currentDate = [NSDate date];//获取当前时间,日期 NSDateFormatter *dateFormatter = [[NSDateFormatter a ...
- Linux文件权限及用户管理
/etc/passwd文件与 /etc/shadow文件/etc/passwd文件/etc/passwd文件主要存放登录名.UID等用户相关信息,用户登录密码存放在/etc/shadow文件中.例子: ...
- 网络请求 ---iOS
//1.url要访问的资源 NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"]; //2.请求,要向服务器请求 N ...
- java udp (使用类调用双通信)1
项目需要就使用了UDP通信,做了java的双方通信,其实代码还是来自之前的udp学习代码,自己加了注释,并且优化的使用类来封装关于通信类库的使用代码 目的是为了在安卓项目中使用时,可以通过实例化,调用 ...
- 简洁、轻量的前端UI框架 - Hbook
Simple, lightweight front-end UI framework Get Start : http://www.bookcss.com Introduce Hbook focus ...
- Win7配置IIS7
1.安装 控制面板\程序\程序和功能\打开或关闭Windows功能 选择Internet信息服务勾选相应的内容 2.打开iis信息服务管理器 点击菜单\运行(WIN+R) 输入iis 如图所示 可 ...
- GET和POST的区别,何时使用POST?
GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符 POST:一般用于修改服务器上的资源,对所发送的信息没有限制. GET方式需要使用Re ...