首页 > 其他分享 >JoinPoint 常用的方法

JoinPoint 常用的方法

时间:2024-03-30 15:23:03浏览次数:17  
标签:info 常用 joinPoint log JoinPoint getSignature 方法 proceed

  • Object[] getArgs:返回目标方法的参数
  • Signature getSignature:返回目标方法的签名
  • Object getTarget:返回被织入增强处理的目标对象
  • Object getThis:返回AOP框架为目标对象生成的代理对象

* JoinPoint对象用于获取切面对象上下文信息,Aop将连接点的上下文信息封装为JoinPoint对象
* 通过JoinPoint对象可以获取到执行方法的相关信息,参数信息,代理对象的信息等。
* JoinPoint对象主要有以下几个方法
* getTarget():获取被代理的对象信息
* getThis():获取代理对象自己的信息
* getgetArgs():获取传入该方法的参数信息
* getSignature():获取执行方法的信息,通过该方法可以获取到方法名称,方法的类名和全类名,方法的声明类型等,如下
* getSignature().getName():获取方法名称
* getSignature().getModifiers():获取方法的声明类型
* getSignature().getDeclaringTypeName():获取执行方法所属类的类名
* getSignature().getDeclaringType().getSimpleName():取执行方法所属类的简单类名
*
* 其中:
* 环绕通知的参数为ProceedingJoinPoint,该对象是JoinPoint的子接口,新增了两个方法,proceed()和proceed(Object[] args)
* 在环绕通知中,可以直接通过proceed()方法获取到方法执行之后的返回结果。
* 并且在环绕通知中,必须调用proceed()方法来执行目标方法,否则会造成通知执行了,目标方法没执行。
* 总的来说,在环绕通知中,目标方法是否执行, 你可以理解为是否调用了proceed()方法。
* 环绕通知的方法需要返回目标方法执行之后的结果。如果你在环绕通知中没有调用proceed()方法获取目标方法的返回值结果,会报空指针。
* 如果你使用了proceed(Object[] args)这个方法,它会使用args作为新的参数去执行目标方法。

package com.dong.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.junit.jupiter.api.parallel.Execution;
import org.springframework.stereotype.Component;

import java.lang.reflect.Array;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;

@Aspect
@Slf4j
@Component
public class Longger {
    @Pointcut(value = "execution(* com.dong.controller..*(..))")
    public void logger() {
    }

    /**
     * JoinPoint对象用于获取切面对象上下文信息,Aop将连接点的上下文信息封装为JoinPoint对象
     * 通过JoinPoint对象可以获取到执行方法的相关信息,参数信息,代理对象的信息等。
     * JoinPoint对象主要有以下几个方法
     * getTarget():获取被代理的对象信息
     * getThis():获取代理对象自己的信息
     * getgetArgs():获取传入该方法的参数信息
     * getSignature():获取执行方法的信息,通过该方法可以获取到方法名称,方法的类名和全类名,方法的声明类型等,如下
     * getSignature().getName():获取方法名称
     * getSignature().getModifiers():获取方法的声明类型
     * getSignature().getDeclaringTypeName():获取执行方法所属类的类名
     * getSignature().getDeclaringType().getSimpleName():取执行方法所属类的简单类名
     *
     * 其中:
     * 环绕通知的参数为ProceedingJoinPoint,该对象是JoinPoint的子接口,新增了两个方法,proceed()和proceed(Object[] args)
     * 在环绕通知中,可以直接通过proceed()方法获取到方法执行之后的返回结果。
     * 并且在环绕通知中,必须调用proceed()方法来执行目标方法,否则会造成通知执行了,目标方法没执行。
     * 总的来说,在环绕通知中,目标方法是否执行, 你可以理解为是否调用了proceed()方法。
     * 环绕通知的方法需要返回目标方法执行之后的结果。如果你在环绕通知中没有调用proceed()方法获取目标方法的返回值结果,会报空指针。
     * 如果你使用了proceed(Object[] args)这个方法,它会使用args作为新的参数去执行目标方法。
     */

    @Before(value = "logger()")
    public void before(JoinPoint joinPoint) {
        log.info("前置通知,方法执行之前执行!");
        Object target = joinPoint.getTarget();
        Object aThis = joinPoint.getThis();
        log.info("前置通知:被代理对象为:{}", target.toString());
        log.info("前置通知:代理对象自己为:{}", aThis.toString());
        String name = joinPoint.getSignature().getName();
        log.info("前置通知:执行方法的名称为:{}", name);
        String declaringTypeName = joinPoint.getSignature().getDeclaringTypeName();
        log.info("前置通知:执行方法的类名为:{}", declaringTypeName);
        String modifierType = Modifier.toString(joinPoint.getSignature().getModifiers());
        log.info("前置通知:执行方法的声明类型为:{}", modifierType);
        Object[] args = joinPoint.getArgs();
        List<Object> objects = Arrays.asList(args);
        log.info("前置通知:执行方法:{},接收到的参数为:{}", name,objects);
        log.info("前置通知结束!");
    }

    @Around(value = "logger()")
    public Object after(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("环绕通知开始");
        Long startTime=System.currentTimeMillis();
        String name = joinPoint.getSignature().getName();
        Object proceed = joinPoint.proceed();
        String s = joinPoint.getSignature().toString();
        log.info("环绕通知:{}方法的返回值为:{}",name,proceed.toString());
        log.info("环绕通知:{}方法执行完毕,耗时{}ms!",name,System.currentTimeMillis()-startTime);
       log.info("环绕通知结束");
       //需要返回joinPoint.proceed()的结果,否则会导致增强的方法执行了,而目标方法没有执行的问题。
        return proceed; 
 
    }

    @After(value = "logger()")
    public void after(JoinPoint joinPoint){
        log.info("后置通知开始");
        log.info("后置通知:{}方法执行结束",joinPoint.getSignature().getName());
        log.info("后置通知开始");
    }

    @AfterReturning(value = "logger()",returning = "result")
    public void afterReturning(JoinPoint joinPoint,Object result){
        log.info("返回通知开始");
        log.info("返回通知:{}方法执行结束,返回值为:>>>>>{}",joinPoint.getSignature().getName(),result.toString());
        log.info("返回通知结束");
    }
    @AfterThrowing(value = "logger()",throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint,Exception ex){
        log.info("异常通知开始");
        log.info("异常通知:{}方法异常,异常信息为:{}",joinPoint.getSignature().getName(),ex);
        log.info("异常通知结束");
    }
}

 https://blog.csdn.net/qq_44730730/article/details/134006899

标签:info,常用,joinPoint,log,JoinPoint,getSignature,方法,proceed
From: https://www.cnblogs.com/isme-zjh/p/18105542

相关文章

  • Array方法总结(三)
    Array.prototype.slice()返回一个新的数组对象。从原数组的start和end(不包括end)索引范围内浅拷贝。slice(start,end)constfruits=["Banana","Orange","Lemon","Apple","Mango"];constcitrus=fruits.slice(1,3);//fruits包含['......
  • Array方法总结(一)
    Array.prototype.at()at(index) 传入一个整数值参数,返回该索引对应的元素。传入负整数从数组最后一个元素开始倒数。constarray=[10,8,2];console.log(array.at(-2));//8Array.prototype.concat()合并两个或多个数组。返回一个新数组。constarray1=[7,[1,......
  • Linux常用快捷键
    必用必记1、命令或路径的补全键Tab使用:命令补全;文件名或者路径补全连续按2次Tab键,显示以已输入字符开头的所有命令、文件名或路径2、光标回到命令首行ctrl+a3、光标回到命令行尾ctrl+e4、中断终端正在执行的任务或者删除整行ctrl+c使用:结束目前正在运行的程......
  • 新手小白如何学习Python 选对方法很重要(附教程)
    近年来,Python应用领域增多、就业薪资上涨,这吸引了很多人关注学习。更重要的是Python语法简洁、功能强大,即使是0基础也能学会,这让很多想要从事IT开发的人看到了希望。不过新手小白如何学习Python呢?Python是一门语法简洁、功能强大、上手简单的计算机编程语言,根据TIOBE最新排......
  • FFmpeg常用命令
    FFmpeg常用命令1.信息查询命令ffmpeg-hfull或者manffmpeg#查询帮助手册Usage:ffmpeg[options][[infileoptions]-iinfile]...{[outfileoptions]outfile}....#具体各种可选操作可使用ffmpeg-hfull查看,也可使用manffmpeg查看例子2.分解/复用命令其实就是......
  • day01-字符串方法-逻辑运算符规律
    字符串方法 查询类方法 字符串.index(字符):查询指定字符在整个字符串中第一次出现的位置下标;如果下表不存在则报错字符串.find(字符):查询指定字符在整个字符串中第一次出现的位置下标;如果下表不存在则返回-1字符串.rindex(字符):查询指定字符在整个字符串中最后一次出现的......
  • 一文搞懂!super(子类, self).父类方法(参数)的作用及使用方法
    文章目录一、作用详解二、使用方法三、注意事项一、作用详解super(子类,self).父类方法(参数)的作用是:在子类中调用父类方法。下面我们来拆解一下这句代码:super():输入一个对象,它会将方法调用委托给该对象的父类。super(子类,self):输入的对象是子类,self指子类实......
  • Node.js入门:常用命令一览
    I.引言A.介绍Node.js的概念和应用场景Node.js是一个开源的、跨平台的JavaScript运行时环境,它可以用于服务器端的JavaScript应用程序开发。Node.js具有高性能、轻量化、易使用的特点,在Web应用、网络服务、数据交换等多个领域有着广泛的应用。Node.js使用事件驱动、非阻塞I/O......
  • 程序员在平台兼职接单,月入30K,方法我全写出来了!(附接单渠道和注意事项)
    本月兼职的收入又到账了,程序员副业实在是太香了!虽然这点小钱还远远达不到财富自由,也比不上那些真正的大佬,但在这个行业寒冬里,能有一笔相对稳定的收入,作为全职之外的补充,还是让人倍感踏实的!今天我就掏心掏肺地跟大家讲一讲,平台接单的二三事,知无不言言无不尽!什么是程序员......
  • lodash已死?radash最全使用介绍(附源码详细说明)—— Array方法篇(1)
    相信很多前端同学甚至非前端都或多或少使用过lodash库,我们都知道lodash是一个非常丰富的前端工具库,比如最常用的防抖和节流,使用lodash都能很快实现,在github上更是有着58.7k的star数。但最近出现的Radash库,号称lodashplus版本,比之更新、更小、更全面、源码更易于理解。阅读本文......