AOP:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
android AOP流程:
1.导入aspectjrt.jar 包
2.在build.gradle里加上
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.aspectj:aspectjtools:1.8.8'
classpath 'org.aspectj:aspectjweaver:1.8.8'
}
}
上面的是第三方编译 就是用它把java 编译成class
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;
}
}
}
}
上面代码是为了能在AOP上打印出日志,也在build.gradle里面
3. 这就是切面里可以自己写想实现的逻辑,我这里用的统计时间
@Aspect
public class BehaviorTraceAspect {
//定义切面的规则
//1.就在原来应用中哪些注释的地方放到当前切面进行处理
//execution(注释名 注释用的地方)
@Pointcut("execution(@com.example.annotation.BehaviorTrace * *(..))")
public void methodAnnotatedWithBehaviorTrace(){}
//2.对进入切面的内容如何处理
//advice
//@Before() 在切入点之前运行
//@After() 在切入点之后运行
//@Around() 在切入点前后都运行
@Around("methodAnnotatedWithBehaviorTrace()")
public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable{
MethodSignature methodSignature=(MethodSignature)joinPoint.getSignature();
String className=methodSignature.getDeclaringType().getSimpleName();
String methodName=methodSignature.getName();
String funName=methodSignature.getMethod().getAnnotation(BehaviorTrace.class).value();
//统计时间
long begin=System.currentTimeMillis();
//joinPoint.proceed(); 表示执行你注解的那个方法
Object result=joinPoint.proceed();
long duration=System.currentTimeMillis()-begin;
Log.d("jett",String.format("功能:%s,%s类的%s方法执行了,用时%d ms",funName,className,methodName,duration));
return result;
}
}
4.可以在想统计时间的地方的方法上面加上注解@BehaviorTrace
例如:
/**
* 用来标识性能监测
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BehaviorTrace {
String value();
}
@BehaviorTrace("语音消息")
public void mAudio(View view){
SystemClock.sleep(new Random().nextInt(2000));
}
如果你调用这个mAudio方法的话,就看到效果了
demo:https://download.csdn.net/download/u011586504/11109286
如果还不懂可以参考:https://www.jianshu.com/p/aa1112dbebc7