百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

JoinPoint 常用的方法

citgpt 2024-10-23 09:30 12 浏览 0 评论

  • 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
@Componentpublic 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("异常通知结束");
    }
}


相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: