美文网首页
AOP实现检测方法耗时

AOP实现检测方法耗时

作者: 文子产品笔记 | 来源:发表于2018-08-20 10:51 被阅读0次

写文章之前首先得解释下什么是AOP,AOP(Aspect-Oriented Programming,面向切面编程),它是对OOP(Object-Oriented Programing,面向对象编程)的一种补充,传统的OOP针对业务处理过程的实体及其属性和行为进行高度抽象封装,每个类都是一个独立体,实现特有的功能,互不干扰。而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。

AOP主要功能:

日志记录,性能统计,安全控制,事务处理,异常处理等等。

AOP优点:

1,每个事物逻辑位于一个位置,代码不分散,便于维护和升级

2,业务模块更简洁,只包含核心业务代码

今天这边实现的就是一个日志记录切面,比如在某个页面展现时候特别卡顿,延时比较长,我们可能需要测试这个页面中所有方法耗时时间,找出耗时的方法然后做一些异步操作。

需要用到的第三方.jar包:aspectjrt.jar,需要引用到gradle中。

AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。

也就是说AspectJ编译器在代码的编译阶段植入Pointcut的内容 ,它的性能比较好。

首先,我们自定义一个注解,这个注解是我们暴露在外面的调用的,外面只需要调用这个注解,就会对这个方法进行编译植入我们希望进行切面的操作。

/**

* 用来标识性能监测

*/

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface BehaviorTrace {

    String value() default "";

    String value2() default "";

}

我们在定义一个注解的过程中我们一般需要知道的几个知识点:

1,我们的注解和类一样,使用@interface进行申明

2,指定的注解的运行时机@Retention(RetentionPolicy.RUNTIME),这里我们指定是在运行时,有如下几种参

FF0B337D-2B62-4396-B3B6-299E9C78D4BD.png

3,指定注解的类型@Target(ElementType.FIELD),它有如下几种参数:

6662CDEB-8CB8-4F1A-B1D9-CC276A20F964.png

然后就是定义我们的注解接收的参数,它可以接受基本的数据类型,String,数组等…

其次,我们定义一个类,这个类需要实现@Aspect注解,它的作用是把当前类标识为一个切面可供容器读取。这个类中我们做两个操作,一个是定义AOP切面规则,另一个是对切面内容的处理。

/**

* Created by 48608 on 2018/3/5.

*/

@Aspect

public class BehaviorTraceAspect {

    //定义切面的规则

    //1.就在原来应用中哪些注释的地方放到当前切面进行处理

    //execution(注释名  注释用的地方)

    //com.dcw.aop_aspect.annotation.BehaviorTrace * *(..)代表的是任意定义了BehaviorTrace注解的方法都执行这个切面方法

    @Pointcut("execution(@com.dcw.aop_aspect.annotation.BehaviorTrace * *(..))")

    public void methodAnnotatedWithBehaviorTrace(){}

    //2.对进入切面的内容如何处理

    //advice

    //@Before()  在切入点之前运行

    //@After()  在切入点之后运行

    //@Around()  在切入点前后都运行

    //围绕methodAnnotatedWithBehaviorTrace()方法进行切面操作

    @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();

        //插入原有的代码

        Object result=joinPoint.proceed();

        long duration=System.currentTimeMillis()-begin;

        Log.d("dcw",String.format("功能:%s,%s类的%s方法执行了,用时%d ms",funName,className,methodName,duration));



        return result;

    }

}

其中@Pointcut("execution(@com.dcw.aop_aspect.annotation.BehaviorTrace * *(..))")是定义切面规则,execution是切入点指示符,这里用法很多样灵活,具体可以自己百度。

@ Around代表在切入点joinPoint.proceed()前后都有代码运行,

@ Before是在所拦截方法执行之前执行一段逻辑

@ After是在所拦截方法执行之后执行一段逻辑

其中@ Before,@ After注解方法里面只需要写切入内容,不需要调用joinPoint.proceed(),如果在Before里面做如下操作是会报异常的。


@Before("methodAnnotatedWithBehaviorTrace()")

    public Object beforeJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable{

        //插入原有的代码

        Object result=joinPoint.proceed();

        Log.d("dcw","before操作");



        return result;

    }

注意同一个方法被多个Aspect类拦截可能会报出异常。

具体使用的时候只需要在外部定义一个方法就实现@BehaviorTrace注解就可以,你可以在Log区域打印出这个方法执行的时间。


    @BehaviorTrace(value = "摇一摇",value2="haha")

    public void mShake(View view){

        SystemClock.sleep(new Random().nextInt(100));

    }

这就实现了一个依赖于Aspect的切面实现方法耗时检测功能了。

相关文章

  • AOP实现检测方法耗时

    写文章之前首先得解释下什么是AOP,AOP(Aspect-Oriented Programming,面向切面编程)...

  • Android性能优化:UI卡顿、帧率检测&优化

    前言 本文主要分享:handler耗时检测、帧率、丢帧统计的方法。 统计方法与实现 我们知道,Handler有个成...

  • 内存优化

    1.内存优化 检测方法耗时信息使用TraceView或者AS自带Profile工具,实现原理:Debug.star...

  • Android AOP统计方法耗时

    一般可以采用以下两种方式1、aspectj框架2、动态代理+自定义注解 代码示例:https://github.c...

  • spring 事务管理

    基于aop, 实现事务管理 service层的第一个非事务方法调用事务方法, 会导致事务失效. 由于aop 的实现...

  • AOP实现登陆检测

    为何想到AOP AOP 项目完整代码 如何接入 AspectJ 具体实现 自定义切点 切面 使用如何 获取切点中的...

  • filter 与 interceptor

    filter 基于servlet 回调实现 interceptor 基于spring 方法反射实现,类似aop前,...

  • Spring AOP

    AOP 面向切面编程,旨在各个方法中抽离出每个方法都要执行的耦合方法,达到代码复用的目的 JAVA中的AOP的实现...

  • SpringAOP实现源码解读

    1、Spring AOP样例 简单介绍怎么样基于Spring实现AOP编程(注解方式在目标对象方法中织入通知方法)...

  • 通过自定义注解防止重复提交

    1. 自定义注解 2.aop拦截方法实现

网友评论

      本文标题:AOP实现检测方法耗时

      本文链接:https://www.haomeiwen.com/subject/lxghiftx.html