【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )(二)

简介: 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )(二)

4、完整 Aspect 切面代码


package com.example.aop_demo;
import android.util.Log;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
/**
 * 定义 Aspect 切面
 */
@Aspect
public class MonitorAspect {
    private static final String TAG = "MonitorAspect";
    /**
     * 定义切入点
     * "execution(@com.example.aop_demo.Monitor * *(..))" 表示
     *      带有 @com.example.aop_demo.Monitor 注解的
     *      所有包下面的 所有类中的 所有方法, 方法参数不限
     *      上述方法组成 切入点 , 每个方法都是一个 Join Point 连接点
     *
     * execution(@com.example.aop_demo.Monitor * *(..)) 解读
     *  - @com.example.aop_demo.Monitor 表示带该注解的方法
     *  - 第 1 个 * 表示在所有包下面
     *  - 第 2 个 * 表示在所有类下面
     *  - (..) 表示所有方法 , 参数不限
     *
     *  所有的包 所有的类 中 , 带有 @com.example.aop_demo.Monitor 注解的方法 , 都是 Pointcut 切入点
     *      上述每个方法都是一个 Join Point 连接点
     */
    @Pointcut("execution(@com.example.aop_demo.Monitor * *(..))")
    public void pointCut(){}
    /**
     * 逐个处理 Pointcut 切入点 中的 JoinPoint 连接点
     *      一个一个处理
     *
     * @Around("pointCut()") 注解中传入的注解属性是
     *      切入点的名称 , 就是上面定义的 public void pointCut(){} 方法
     *
     * @param joinPoint
     * @return
     */
    @Around("pointCut()")
    public Object processJoinPoint(ProceedingJoinPoint joinPoint) {
        Object result = null;
        try {
            // 获取方法上 @Monitor("onClick") 注解中的注解属性 字符串
            // 获取被 @Monitor("onClick") 注解修饰的方法的 方法签名
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            // 根据方法签名获取方法
            //      然后获取方法上的 @Monitor 注解
            Monitor annotation = signature.getMethod().getAnnotation(Monitor.class);
            // 获取 @Monitor("onClick") 注解中的注解属性
            String value = annotation.value();
            // 获取方法名称
            String className = signature.getDeclaringType().getSimpleName();
            // 获取方法所在的类名
            String methodName = signature.getName();
            // 记录方法执行开始时间
            long startTime = System.currentTimeMillis();
            // 执行具体的方法
            result = joinPoint.proceed();
            // 记录方法执行结束时间
            long endTime = System.currentTimeMillis();
            Log.i(TAG, "执行 " + className + " 中的 " + methodName +
                    " 方法花费了 " + (endTime - startTime) + " ms , 注解属性为 " + value );
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return result;
    }
}






三、使用 AspectJ 埋点并监控方法性能


监控 public void textClick(View view) 方法性能 , 在该方法上使用 @Monitor 注解 , 该注解已经被定义为切入点 , 所有的包 所有的类 中 , 带有 @com.example.aop_demo.Monitor 注解的方法 , 都是 Pointcut 切入点 , 应用执行时 , 会自动执行埋点业务逻辑 , 这里是在方法执行前后 , 分别记录时间 , 最终计算出方法的耗时 ;


package com.example.aop_demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    @Monitor("textClick")
    public void textClick(View view) {
        // 休眠 500 ms
        SystemClock.sleep(500);
    }
}


执行结果 : 点击按钮 , 触发 textClick 方法 , 触发了埋点逻辑 , 自动计算出了该方法的执行耗时 ;


2021-09-22 22:23:04.954 12492-12492/com.example.aop_demo I/MonitorAspect: 执行 MainActivity 中的 textClick 方法花费了 501 ms , 注解属性为 textClick

image.png


目录
相关文章
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
861 2
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
1790 2
|
XML 监控 Java
Java中的AOP编程:AspectJ与Spring AOP的应用
Java中的AOP编程:AspectJ与Spring AOP的应用
|
Java 编译器 Maven
Java一分钟之-AspectJ:AOP库
【6月更文挑战第13天】AspectJ是Java的AOP框架,扩展了语言并提供编译时和加载时织入,便于模块化横切关注点。关键概念包括编织、切面、切点和通知。常见问题涉及编译时织入配置、切点表达式误用、异常处理和版本兼容性。通过正确配置构建工具、精准设计切点、妥善处理异常和确保版本兼容,可避免这些问题。文中还提供了一个记录服务层方法执行时间的代码示例,帮助读者快速上手AspectJ。
852 2
|
Java 开发者 Spring
Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
【5月更文挑战第1天】Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
326 5
|
XML Java 数据库
Spring5入门到实战------10、操作术语解释--Aspectj注解开发实例。AOP切面编程的实际应用
这篇文章是Spring5框架的实战教程,详细解释了AOP的关键术语,包括连接点、切入点、通知、切面,并展示了如何使用AspectJ注解来开发AOP实例,包括切入点表达式的编写、增强方法的配置、代理对象的创建和优先级设置,以及如何通过注解方式实现完全的AOP配置。
|
Java
SpringBoot整合AOP整合aspectj实现面向切面编程实现参数接收和请求时间打印
SpringBoot整合AOP整合aspectj实现面向切面编程实现参数接收和请求时间打印
339 0
|
Java 编译器 程序员
Spring AOP 和 AspectJ 的比较
Spring AOP 和 AspectJ 的比较
826 0
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
963 0
|
监控 Java Spring
AOP 切面编程
AOP(面向切面编程)通过动态代理在不修改源码的前提下,对方法进行增强。核心概念包括连接点、通知、切入点、切面和目标对象。常用于日志记录、权限校验、性能监控等场景,结合Spring AOP与@Aspect、@Pointcut等注解,实现灵活的横切逻辑管理。
2671 6
AOP 切面编程