资源链接aspect.jar
优势:利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
以下是实现aop开发最基本的实现
1,在app中的build.gradle中添加一下代码(加粗部分):
apply plugin: 'com.android.application' //Aop需要用自己的编译器进行编译 buildscript { repositories { mavenCentral() } dependencies { classpath 'org.aspectj:aspectjtools:1.8.8' classpath 'org.aspectj:aspectjweaver:1.8.8' } } android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { applicationId "com.richard.aop" minSdkVersion 15 targetSdkVersion 26 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(include: ['*.jar'], dir: 'libs') 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:26.+' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' compile files('libs/aspectjrt.jar') } //以下代码是为了看aspect打印信息 import org.aspectj.bridge.IMessage import org.aspectj.bridge.MessageHandler import org.aspectj.tools.ajc.Main 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.8", "-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; } } } }
2.在activity_main布局文件中添加四个按钮,代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.richard.aop.MainActivity" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="mShake" android:text="摇一摇" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="mAudio" android:text="语音消息" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="mVideo" android:text="视频通话" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="saySomething" android:text="发表说说" /> </LinearLayout>
3,在java代码中处理四个按钮的点击事件
/** * 摇一摇事件 * @param view */ @BehaviorTrace("摇一摇") public void mShake(View view) { } /** * 语音消息 * @param view */ @BehaviorTrace("语音消息") public void mAudio(View view) { } /** * 视频通话 * @param view */ @BehaviorTrace("视频通话") public void mVideo(View view) { } /** * 发表说说 * @param view */ @BehaviorTrace("发表说说") public void saySomething(View view) { }
4,定义一个注解类BehaviorTrace,如下所示:然后将这些注解用在每个按钮点击回调方法的上面,
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface BehaviorTrace { String value(); }
5,写一个切面类BehaviorTraceAspect:
/** * Created by Administrator on 2018/3/17 0017. */ @Aspect public class BehaviorTraceAspect { public static final String TAG = "BehaviorTraceAspect"; //定义切面的规则 //就是将之前使用注解的地方加入到切面 @Pointcut("execution(@com.richard.aop.annotation.BehaviorTrace * *(..))") public void methodAnnotionWithBahaviorTrace(){} //2.对进入切面的内容如何处理 //advice //@Before() 在切入点之前运行 //@After() 在切入点之后运行 //@Around() 在切入点前后都运行 @Around("methodAnnotionWithBahaviorTrace()") public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); String className = signature.getDeclaringType().getSimpleName(); String methodName = signature.getName(); String funName = signature.getMethod().getAnnotation(BehaviorTrace.class).value(); long begin = System.currentTimeMillis();//开始时间 Object result = joinPoint.proceed(); long end = System.currentTimeMillis(); long duration = end - begin; Log.d("richard",String.format("功能名:%s,%s的%s方法执行了%d时间",funName,className,methodName,duration)); return result; } }