300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 使用Aspect实现AOP(面向切面编程)

使用Aspect实现AOP(面向切面编程)

时间:2020-07-25 15:44:15

相关推荐

使用Aspect实现AOP(面向切面编程)

一、准备工作

AS及Gradle版本配置,几个可用版本

As3.0.1 gradle4.4-all ndk r17

As3.2.1 gradle4.6-all

As3.4.0 gradle5.1.1-all

项目gradle配置

classpath 'org.aspectj:aspectjtools:1.8.9'classpath 'org.aspectj:aspectjweaver:1.8.9'

3.module中的gradle配置(三处)

第一处

buildscript {// 编译时用Aspect专门的编译器,不再使用传统的javacrepositories {mavenCentral()}dependencies {classpath 'org.aspectj:aspectjtools:1.8.9'classpath 'org.aspectj:aspectjweaver:1.8.9'}}

第二处:

//aspect的jar包implementation 'org.aspectj:aspectjrt:1.8.13'

第三处:

//aspect支持import org.aspectj.bridge.IMessageimport org.aspectj.bridge.MessageHandlerimport org.aspectj.tools.ajc.Mainfinal def log = project.loggerfinal def variants = project.android.applicationVariantsvariants.all {variant ->if (!variant.buildType.isDebuggable()) {log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")return;}JavaCompile javaCompile = variant.javaCompilejavaCompile.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.thrownbreak;case IMessage.WARNING:log.warn message.message, message.thrownbreak;case IMessage.INFO:log.info message.message, message.thrownbreak;case IMessage.DEBUG:log.debug message.message, message.thrownbreak;}}}}

二、定义注解

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface ClickBehavior {String value();}

三、定义注解对应的Aspect类

在类名上加“@Aspect”注解,使其变成切面类定义个方法1定义切入点规则,方法名随意,添加注解“@PointCut("execution(切入点的位置)")”注解定义个方法2作为通知,方法名随意,返回值必须为Object,参数必须是ProceedingJoinPoint,必须抛出异常Throwable;并添加方法注解(切入方式)@Around("方法1方法名")/@Before()/@After

具体代码:

//定义此类为切面类@Aspectpublic class ClickBehaviorAspect {private static final String TAG = "netease>>>";//定义切入点规则// 使用Pointcut注解,execution(切入点的位置)@Pointcut("execution(@com.wkr.retrofit.annotation.ClickBehavior * *(..))")public void methodPointCut() {}//定义织入规则:Before 方法执行前 ;After 方法执行后 ; Around 方法执行前后;参数为切入点的方法名//方法定义规则:// 1、方法返回值为Object// 2、入参必须为ProceedingJoinPoint// 3、必须抛出Throwable异常@Around("methodPointCut()")public Object joinPoint(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();Method method = methodSignature.getMethod();Log.e(TAG, "<---------------方法执行前------------->");Log.e(TAG, "方法名:" + method.getName());Log.e(TAG, "类名:" + methodSignature.getDeclaringTypeName());Log.e(TAG, "注解值:" + method.getAnnotation(ClickBehavior.class).value());Object result = proceedingJoinPoint.proceed();Log.e(TAG, "<---------------方法执行后------------->");return result;}}

使用:

@ClickBehavior("登录")public void goDl(View view) {Log.e(TAG,"<---------------登录方法---------------->");}

结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。