AOP面向切面设计编程

241 篇文章 5 订阅

一、

OOP(Object Orented Programming):面向对象设计编程

二、

AOP(面向切面编程):就是我们把某个方面的功能提出来与一批对象进行隔离,这样降低对象之间降低耦合性,就可以对某个功能进行编程

AOP的意义:解决了OOP面向对象解决不了的问题,这个问题就是跨模块编程

AOP的应用:Android用户行为统计、权限管理

AOP更好的实践方式:

AspectJ: AspectJ是一个面向切面的框架,他扩展了java语言所以他有一个专门的编译器用来生成遵守java字节码规范的Class文件

包含:1、aspect:切面

            2、pointcut:切点

            3、Around:处理 

三、

Android Studio导入流程:

1、在project的build.gradle中添加下面的代码

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

 

 

2、在app的build.gradle中指定编译版本

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

3、在app的build.gradle中添加aspectJ依赖

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.aspectj:aspectjtools:1.8.9'
        classpath 'org.aspectj:aspectjweaver:1.8.9'
    }
}

4、

将aspectJ的jar包放入libs文件中,并在gradle中添加依赖

 

5、在app的build.gradle中添加如下代码

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;
            }
        }
    }
}

注:

1、参考资料

下载aspectj  地址   http://www.eclipse.org/aspectj/downloads.php

下载aspectj的adt地址http://www.eclipse.org/ajdt/downloads/#43zips

build.gradle  aspectJ  写法  http://fernandocejas.com/2014/08/03/aspect-oriented-programming-in-android/

 

2、

需要指定以1.8编译,否则会报下面的错

android打包报错“Caused by: com.android.tools.r8.utils.AbortException”

解决办法:在app的build.gradle文件中指定编译版本为1.8

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

 

3、

报错:

Execution failed for task ':app:transformClassesWithDexBuilderForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: zip file is empty
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值