android studio aspectj使用,androidStudio中使用 AspectJ

关于 AOP 的详细介绍请参考 深入理解Android之AOP

本文主要介绍 怎么在 AndroidStudio 中使用 AspectJ

1 . 在android studio 中新建一个项目 MyApplication

2. 在 app 目录下 的 build.gradle 中完成如下配置:

apply plugin: 'com.android.application'

import org.aspectj.bridge.IMessage

import org.aspectj.bridge.MessageHandler

import org.aspectj.tools.ajc.Main

buildscript {

repositories {

mavenCentral()

}

dependencies {

classpath 'org.aspectj:aspectjtools:1.8.9'

}

}

repositories {

mavenCentral()

}

android {

compileSdkVersion 25

buildToolsVersion "25.0.2"

defaultConfig {

applicationId "com.example.yqqyang.myapplication"

minSdkVersion 23

targetSdkVersion 25

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

}

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

exclude group: 'com.android.support', module: 'support-annotations'

})

compile 'com.android.support:appcompat-v7:25.3.1'

compile 'com.android.support.constraint:constraint-layout:1.0.2'

testCompile 'junit:junit:4.12'

compile 'org.aspectj:aspectjrt:1.8.9'

}

final def log = project.logger

final def variants = project.android.applicationVariants

variants.all { variant ->

if (!variant.buildType.isDebuggable()) {

log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")

return;

}

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)]

log.debug "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:

log.warn message.message, message.thrown

break;

case IMessage.INFO:

log.info message.message, message.thrown

break;

case IMessage.DEBUG:

log.debug message.message, message.thrown

break;

}

}

}

}

如此 gradle 的配置就算完成了,接下来要编写代码了

3.在MainActivity 的同级目录下创建 AspectMethod.java 文件.

4. 在 AspectMethod.java 中编写代码(下方代码中com.example.yqqyang.myapplication.MainActivity 请换成 自己的包名类名):

package com.example.yqqyang.myapplication;

import android.util.Log;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

/**

* @author YQQ.yang.

* @date 2017/5/10 9:26.

*/

@Aspect

public class AspectMethod {

private static final String TAG = "QQ";

@Before("execution(* com.example.yqqyang.myapplication.MainActivity.*(..))")

public void beforeMethodExe(JoinPoint joinPoint) {

Log.e(TAG, "before----- > " + System.currentTimeMillis());

}

@After("execution(* com.example.yqqyang.myapplication.MainActivity.*(..))")

public void afterMethodExe(JoinPoint joinPoint) {

Log.e(TAG, "after ----- > " + System.currentTimeMillis());

}

}

5. 运行 app moudle

在 logcat 会有如下输出:

打开 app/build/intermediates/classes/debug/com/example/yqqyang/myapplication/MainActivity.class 文件,会发现 编译后的 MainActivity 里面的代码已经改变了:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567160.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ndnsim r语言 ubuntu_Ubuntu14.04安装配置ndnSIM

Ubuntu14.04安装配置ndnSIM预环境Ubuntu14.04官方系统请先使用sudo apt-get update更新一下源列表安装步骤安装boost-libsudo apt-get install build-essential libsqlite3-dev libcrypto-devsudo apt-get install libboost-all-dev其中,build-essential和libboost是…

android ui stencil kit 下载,实用的iOS6/iPhone5 GUI/iPad PSD以及其它版本素材

实用的iOS6/iPhone5 GUI/iPad PSD以及其它版本素材10月 16, 2012评论 (1)Sponsor现在使用Apple旗下产品越来越多,比如iPhoneiPad等,正因如此,我们需要设计这类的apps应用也相对多了,所以如果有一些现用素材的话可以帮助设计师快速…

华为acl怎么生效_华为ACL配置教程(一)

一、ACL基本配置1、ACL规则生效时间段配置(需要先配置设备的时间,建议用ntp同步时间)某些引用ACL的业务或功能需要限制在一定的时间范围内生效,比如,在流量高峰期时启动设备的QoS功能。用户可以为ACL创建生效时间段,通过在规则中引…

android 中文参数,(原)Android: 启动另外的APP及传递参数

有时候需要从一个APP中启动另外一个APP,比如Twitter/微信等。如果你不知道那个APP的Activity,但是知道包名(package name),那么可以使用如下的方法:Intent LaunchIntent getPackageManager().getLaunchIntentForPackage("co…

kafka 主动消费_Kafka核心API——Consumer消费者

Consumer之自动提交在上文中介绍了Producer API的使用,现在我们已经知道如何将消息通过API发送到Kafka中了,那么现在的生产者/消费者模型就还差一位扮演消费者的角色了。因此,本文将介绍Consumer API的使用,使用API从Kafka中消费消…

android下拉弹性gif,android-pulltorefresh 下拉加载中使用gif动图

效果预览:xml布局xmlns:ptr"http://schemas.android.com/apk/res-auto"android:layout_width"fill_parent"android:layout_height"fill_parent"android:divider"#00000000"android:cacheColorHint"#00000000"and…

linux本地时间与utc不一致_Linux下CST和UTC时间的区别以及不一致的解决方法

1.在linux中,用date查看时间的时候显示:2013年 2月 17日 星期三 19:04:14 CST世界协调时间(Universal Time Coordinated,UTC):GPS 系统中有两种时间区分,一为UTC,另一为LT(地方时)两者的区别为时区不同,UTC就是0时区的…

ios uiview 如何刷新_ios-如何在Swift中刷新imageview而无需重新加载页面?

我有一个更新照片按钮,该按钮连接到facebookgraphAPI并下载当前用户的个人资料图片.我希望刷新视图上的图像,而无需重新加载viewController.有什么办法可以做到这一点?我知道tableview具有reloadData和refreshcontrol,但是我没有使用tableview.class ProfileViewCon…

unity3d android aar,Android Stuido导出AAR 给Unity3D调用注意事项

1. 导出 AAR过程需要注意,依赖的文件并没有打进去,所以要收到拷入到 Unity项目中,如下图中的 support包,是我项目中要用到的:2.删除aar包中重复的 libs下的 jar文件和 jni下的 .so文件,否则调用的时候会报…

识别产品外观的合格软件_产品外观质量视觉检测系统.PDF

产品外观质量视觉检测系统产品外观质量视觉检测系统北京大恒图像视觉有限公司Beijing Daheng Image Vision Co., Ltd公司简介中国大恒(集团)有限公司是中国科学院于 1987 年报经国务院批准创办的高新技术企业,公司于 1996 年至2007 年连续十二年进入全国电子百强企业…

html中图片响应式怎么写,如何使用 HTML5 的picture元素处理响应式图片

图片在响应式网页设计中是出了名的最具挑战性的方面之一。今天我们就来看看如何使用元素来处理响应式图片.让我们先了解一下问题固定宽度,像素完美的网站设计已经离我们远去了。在宽屏显示器,互联网电视,多尺寸的平板电脑和智能手机的今天&am…

安卓 多条通知_安卓11第一版发布:原生滚动截屏、屏幕录像、抄国内ROM这么多...

自2008年第一部Android智能手机HTC G1发布,安卓手机系统已经走过十几个年头。虽然系统存在一些大家吐槽较多的问题,但安卓一直活跃在智能手机系统前沿,不断发展完善着。昨天谷歌刚刚发布了全新的安卓11新系统,这次的系统更新出一些…

python樱花手绘_GitHub 硬核项目:动漫生成器让照片秒变手绘日漫风!!!

根据真实店铺照片生成的效果图,一度以为,这就是某个日漫番剧的截图本文转自:机器之心随手拍张照片,顺势转换为宫崎骏、新海诚等日漫大师的手绘风格作品,这个专门生成动漫图像的 GAN,实测很好用。尽管最近 2…

html表格字体格式转换,【转】常用HTML代码速查表

在搏客中比较常用的代码一、美化文字的代码:1.文字间换行:文字内容文字内容2.一个段落:文字内容3.字体加粗:文字内容4.字体加大:文字内容5.文字标题: 从一号标题H1到六号标题H6,逐渐减小文字内容…

70个python毕设项目_56个具有开创性的Python开源项目-开始使用Python

Python正在蓬勃发展,它的Gistub页面也是如此。今年对于Python来说很棒,我们看到了一些非常强大的python开源项目。今天,我们将列出一些最好的python开源项目;尝试至少对其中一个项目做出贡献,这将有助于提高您的Python…

mysqlmodify_modify与change的区别

对mysql的表的表结构进行修改时,有用到change,modify两个,它们都有“改变”的意思,那它们在功能上有什么区别了?做个试验比较下1、字段重命名:1)changemysql> alter table t1 change number id char(2);…

qnetworkreply 获取状态_谈谈Unity Shader中的采样器状态和(Texture Filtering)纹理滤波方式

参考文章:使用采样器状态 - Unity 手册​docs.unity3d.comhttps://blog.csdn.net/chenjinxian_3D/article/details/51816918​blog.csdn.net根据Unity的参考文档,Unity Shader使用采样器状态有三种方式,分别是:耦合的纹理和采样器…

python记录日志_记录python日志

在线运行的应用就是黑盒子,需要被跟踪监控。最简单也最重要的方式就是记录日志。记录日志允许我们在开发软件的同时,让程序在系统运行时发出信息,这些信息对于我们和系统管理员来说都是有用的。就像为将来的程序员写代码文档一样,…

android systemui机制,在AS中开发SystemUI(4):设置项目运行机制

1、期望项目如何运行?普通 App 在 run 之后,会编译出 APK,然后 AS 会自动调用 install 命令进行安装,完成安装后会启动 App 的 Launcher Activity。这些 AS 已经帮你自动完成了。如果你的 App 不像 SystemUI 或 Settings 这样贴近…

手机屏幕厂家信息软件_警惕假个税手机软件蹭热点,千万别被窃取私人信息

新个税法从1月初开始实施。2018年12月31日,国家税务总局推出“个人所得税”APP,方便纳税人线上填报资料进行专项抵扣。几天来,这款APP的下载量和注册量大幅增长。随之而来的是,很多商业公司制作的各类“个税”APP也成为热门。这其…