首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

AspectJ -如何记录被覆盖的方法名而不是超类方法名

AspectJ是一个基于Java语言的面向切面编程(AOP)框架,它可以在编译期或运行期修改Java字节码,以实现横切关注点的模块化。在AspectJ中,可以通过切面(Aspect)来定义横切关注点,并通过切点(Pointcut)来选择目标方法。当目标方法被调用时,切面可以在方法执行前、执行后或抛出异常时插入额外的逻辑。

要记录被覆盖的方法名而不是超类方法名,可以使用AspectJ的@Before注解来实现。在切面中,通过定义一个切点来选择目标方法,然后在@Before注解的方法中获取被覆盖的方法名。具体步骤如下:

  1. 导入AspectJ的相关依赖,例如aspectjrt.jar和aspectjweaver.jar。
  2. 创建一个切面类,使用@Aspect注解标记该类为切面。
  3. 在切面类中定义一个切点,使用@Pointcut注解指定目标方法的匹配规则。可以使用execution表达式来选择目标方法,例如execution(* com.example..(..))表示选择com.example包下的所有方法。
  4. 在切面类中定义一个@Before注解的方法,用于在目标方法执行前执行额外的逻辑。
  5. 在@Before注解的方法中,使用JoinPoint参数来获取被覆盖的方法名。可以通过JoinPoint对象的getSignature().getName()方法来获取方法名。
  6. 在@Before注解的方法中,将获取到的被覆盖的方法名记录下来,可以使用日志框架或其他方式进行记录。

以下是一个示例代码:

代码语言:txt
复制
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class LoggingAspect {
    
    @Pointcut("execution(* com.example.*.*(..))")
    public void targetMethods() {}
    
    @Before("targetMethods()")
    public void logMethodName(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        // 记录被覆盖的方法名
        System.out.println("被覆盖的方法名:" + methodName);
    }
}

在上述示例中,切面类LoggingAspect使用@Aspect注解标记为切面,定义了一个切点targetMethods()来选择目标方法。在@Before注解的方法logMethodName中,通过JoinPoint参数获取被覆盖的方法名,并进行记录。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(云原生Serverless计算服务):https://cloud.tencent.com/product/scf
  • 腾讯云API网关(用于构建和管理API):https://cloud.tencent.com/product/apigateway
  • 腾讯云日志服务(用于日志管理和分析):https://cloud.tencent.com/product/cls
  • 腾讯云监控服务(用于监控云上资源和应用):https://cloud.tencent.com/product/monitoring
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring通过XML配置文件以及通过注解形式来AOP 来实现前置,后置,环绕,异常通知

切面(Aspect):在Spring AOP中,切面可以使用通用或者在普通中以@Aspect 注解(@AspectJ风格)来实现 连接点(Joinpoint):在Spring AOP中一个连接点代表一个方法执行...CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成代理对象是针对目标扩展子类。...可见,在执行EmpController.find()方法之前,执行了方面组件记录日志方法,由于该方法采用AOP面向对象思想实现,因此不需要对Controller做任何改动。...步骤一:创建方面组件 复用方面组件OperateLogger,在该类中创建新记录日志方法log2,代码如下: /** * 方法名:log2 * 详述:环绕通知使用方法 <...步骤一:创建方面组件 复用方面组件OperateLogger,在该类中创建新记录日志方法log3,代码如下: /** * 方法名:log3 * 详述:测试异常通知使用方法<

1.1K20

轻松上手Spring AOP,掌握切面编程核心技巧

Spring框架是我们使用比较多一个框架,AOP又是Spring核心特性之一,本篇文章将介绍一下AOP切点表达式、通知等特性及如何使用Spring AOP。...在传统面向对象编程中,程序功能模块化为和方法,但某些功能可能会跨越多个和方法,如日志记录、事务管理、安全控制等,这些功能不属于核心业务逻辑,但又必须在多个地方重复使用,导致代码重复和耦合性增加...AOP提供了一种机制,可以将这些横切关注点单独定义,并在需要地方插入到应用程序中,不必修改核心业务逻辑。 AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言。...target(): 匹配目标对象为制定类型连接点。与this()不同,target()是基于目标对象类型,不是代理类型。...@within:匹配指定类型带有指定注解连接点。与within()类似,但它是基于注解不是包或

29610
  • Spring全家桶之Spring核心篇,深度分析IoC以及AOP

    jdk动态代理要求目标必须实现接口。要求:目标中必须实现接口 cglib动态代理:第三工具,创建代理对象,原理是继承。通过继承目标,创建子类,子类就是代理对象。...因为最终是不能修改,不 能增强。 3.3.4 目标对象(Target) 目 标 对 象 指 将 要 增 强 对 象 。 即 包 含 主 业 务 逻 辑 对 象 。...上 例 中 StudentServiceImpl 对象若增强,则该类称为目标,该类对象称为目标对象。当然, 不被增强,也就无所谓目标不目标了。...// 以上4个部分,注意这个参数只写参数类型吗,不写参数形参值。...execution(访问权限 方法返回值 包名.名.方法名称(方法参数类型) 异常类型) 复制代码 解释AspectJ参数信息 modifiers-pattern :访问权限类型 ret-type-pattern

    56300

    一文读懂Spring中DI和AOP

    最典型横切关注点有日志记录、性能统计、安全控制、事务处理、异常处理、缓存等。这些横切关注点从概念上与应用业务逻辑相分离(但是往往会直接嵌入到应用业务逻辑中去)。...横切关注点可以模块化为特殊,这些被称为切面(aspect)。...切点定义会匹配要织入一个或多个连接点。通常使用明确和方法名称,或者是利用正则表达式来定义所匹配和方法名来指定切点。...编译期(AspectJ),加载期(AspectJ5 支持),运行期(Spring Aop 以这种方式织入切面的)。...AOP解决问题是如何把应用中横切关注点与业务逻辑相分离,解耦。把之前分散在应用各处行为放入可重用模块中,有效减少了代码冗余,并让更关注于自身主要功能和业务逻辑。

    30710

    Spring AOP

    除了统⼀用户登录判断之外,AOP 还可以实现: 统⼀日志记录:AOP可以在方法调用前后记录日志信息,如方法名、参数、返回值等,从而实现统一日志记录,方便系统监控和调试。...⼀问题,比如用户登录权限验证就是⼀个具体问题,记录所有方法执行日志就是⼀个具体问题,切点定义是某⼀问题。...在目标对象生命周期里有多个点可以进行织入: 编译期:切面在目标编译时织入。这种方式需要特殊编译器。AspectJ织⼊编译器就 是以这种方式织入切面的。...加载期:切面弄在目标加载到JVM时织入。这种方式需要特殊加(ClassLoader),它可以在目标引入应用之前增强该目标字节码。...2、CGLIB 实现,代理可以不实现接口,是通过继承代理,在运行时动态生成代理对象。

    17050

    Spring Boot 使用 AOP 实现 REST 接口简易灵活安全认证

    4、统一异常处理 上文已经提到过,对所有发生异常API,都返回统一格式报文至调用。...我们通常使用明确和方法名称,或是利用正则表达式定义所匹配和方法名称来指定这些切点。 Aspect:切面,把横切关注点模块化为特殊,这些称为切面,切面是通知和切点结合。...(2)字节码生成 动态字节码生成技术是指在运行时动态生成指定一个子类对象(注意是针对),并覆盖其中特定方法,覆盖方法时可以添加增强代码,从而实现AOP。...当需要对所有对象都添加增强,动态代理和字节码生成本质上都需要动态构造代理对象,即最终增强对象是由AOP框架生成,不是开发者new出来。...下面是AspectJ通知和增强5种模式: @Before前置通知,在目标方法执行前实施增强,请求参数JoinPoint,用来连接当前连接点连接细节,一般包括方法名和参数值。

    83020

    @Pointcut 12 种用法,你知道几种?

    Service1中所有方法生效,在通知中可以通过这个名.方法名()引用@Pointcut定义切入点,表示这个通知对这些切入点有效,若@Before和@Pointcut在一个时候,直接通过方法名...并且使用了Anno10注解,内部定义了2个方法大家注意一下 S10位代理目标,继承了S10Parent,内部重写了父m2法,并且又新增了一个m3法 package com.javacode2018...m2法虽然也在S10Parent中定义了,但是这个方法被子类S10重写了,所以调用目标对象中m2时候,此时发现m2法是由S10定义S10.class.getAnnotation(Ann10...S12Parent中,上面有@Ann12注解,连接了,m3法上有@Ann12注解,拦截了,m4上没有@Ann12注解,没有拦截,这3个方法执行结果都很容易理解。...重点在于m2执行结果,没有拦截,m2法虽然在S12Parent中定义时候也有@Ann12注解标注,但是这个方法S1给重写了,在S1中定义时候并没有@Ann12注解,代码中实际上调用是S1

    17K97

    AOP切面编程

    面向切面编程,通过预编译和动态代理实现程序功能统一维护一种技术,主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等 AOP 目的 AOP能够将那些与业务无关,却为业务模块所共同调用逻辑或责任...]:在不修改代码前提下,为添加新方法和属性 目标对象[Target Object]:一个或者多个切面所通知对象 Aop代理[AOP Proxy]:AOP框架创建对象,用来实现切面契约(aspect...下面就再次啰嗦一下分点说明如何使用注解实现AOP 1、连接点 Spring 是方法级别的 AOP 框架,我们主要也是以某个额某个方法作为连接点,另一种说法就是:选择哪一个哪一法用以增强功能。...代码部分中在方法上面的注解看名字也能猜出个大概,下面来列举一下 Spring 中 AspectJ 注解: 注解 说明 @Before 前置通知,在连接点方法前调用 @Around 环绕通知,它将覆盖原有方法...* :代表任意返回类型方法 pojo.Landlord:代表全限定名 service():拦截法名称 通过上面的表达式,Spring 就会知道应该拦截 pojo.Lnadlord

    62720

    一篇文搞懂《AOP面向切面编程》是一种什么样体验?

    写在前面 hello,大家好,我是灰小猿,一个会写bug程序猿! 近期一直在准备秋招和技术,所以写文频率有些下降,但是这也依然阻挡不了我要和大家一起分享技术热情呀。...三、基于AspectJ注解AOP开发 在上一篇文章中我也和大家将了关于spring中注解开发强大,所以关于AOP开发我们同样也可以使用注解形式来进行编写,下面我来和大家介绍一下如何使用注解方式书写...[返回值类型] [简单名/全名] [方法名] ([参数列表])) 其中在表达式中有两个常用特殊符号: 星号“ * ”代表所有的意思,星号还可以表示任意数值类型 “.”号:“…”表示任意类型...,或者方法中途异常抛出,那么对于这些情况,我们应该如何获取到这些信息呢?...通过AspectJ注解,切面可以与AspectJ兼容,基于XML配置则是Spring专有的。由于AspectJ得到越来越多 AOP框架支持,所以以注解风格编写切面将会有更多重用机会。

    45010

    Python扩展方法一二事

    我想到应当可以通过先修改中m1法名称来解决此问题,但是具体不知道如何操作,于是在StackOverflow中提了个问题,很快就有老外大牛回复了。...Level 3 下午看了一下上面在StackOverflow中提问题,又有一个新答案,分析了一下他主要介绍了两点知识,覆盖方法和覆盖实例方法,即扩展方法对整个生效和只对某个实例生效。...当然如果扩展后法名在原中已有,则覆盖之;若无则为新方法。 对具体实例扩展 让我比较意外是python可以对某个实例进行方法扩展,这在其他语言中似乎是基本没有的。...或者是只有a此方法修改了,其他实例并不受影响。...总结 本文简单记录了Python扩展方法实现方式、方法重定义、实例方法扩展等细节,供需查看。

    1.1K60

    如何理解Java中隐藏与覆盖

    发生在子类于父之间,是指在子类与父之间或在同一中定义具有相同法名,访问权限等发。 区别在于返回类型或参数列表。...() ,如果调用a(),出现歧义)      3.main方法也是可以重载 覆盖:子类重写父方法,要求方法名和参数类型完全一样(参数不能是子类),返回值和异常比父小或者相同(即为父子类...覆盖不同于静态隐藏,父中被隐藏方法在子类中完全不可用,中被覆盖方法在子类中可以通过其他方式引用。...发生在子类于父之间,是指在子类与父之间或在同一中定义具有相同法名,访问权限等发。 区别在于返回类型或参数列表。...覆盖不同于静态隐藏,父中被隐藏方法在子类中完全不可用,中被覆盖方法在子类中可以通过其他方式引用。

    3.2K10

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

    对事物抽象 , AspectJ Aspect 切面就是 对切面的抽象 , 其中包含了 Point Cut 切入点 和 Advice 通知 ; 使用 @Aspect 注解修饰 ; /** *...// 获取 @Monitor("onClick") 注解修饰方法 方法签名 MethodSignature signature = (MethodSignature...String value = annotation.value(); 获取方法名称 : signature.getDeclaringType() 就是方法所在字节码对象..., 然后调用 getSimpleName 方法即可获取名 ; // 获取方法名称 String className = signature.getDeclaringType...().getSimpleName(); 获取方法所在名称 : 直接调用方法签名 getName 方法 , 即可获取方法名 ; // 获取方法所在

    68820

    详解Java中高级程序员必须要掌握Spring Aop(上篇)

    引言 在企业级服务中,经常面临多个业务中需要完成一些相同事情,如日志记录、异常处理、事物管理、安全管理等,这些多个业务共同关注点也叫横切关注点( cross-cutting concern...所有通知参数都是静态类型,因此你可以使用确定类型通知参数(例如一个方法执行返回值类型),不是对象数组。 匹配切点表达式连接点概念是AOP中关键,它将AOP与只提供拦截旧技术区分开来。...Spring开发团队认为基于代理框架(如Spring AOP)和成熟框架(如AspectJ)都是有价值,它们是互补不是竞争。...7 获取通知中参数 ---- Spring AOP 提供了5中通知,这意味着你可以在通知签名中声名你需要参数(参考前面的正常返回通知和异常通知中代码示例),不是一直使用对象数组。...9 引入 引入(在AspectJ中称为类型间声明)使切面能够声明通知对象实现给定接口,并代表这些对象提供接口实现。

    1.5K30

    Java开发框架之Spring AOP知识总结

    ,它主要编程对象是切面(aspect), 切面模块化横切关注点.在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响....切点和连接点不是一对一关系,一个切点匹配多个连接点,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用和方法作为连接点查询条件。...4.如何使用AOP? AspectJ:Java 社区里最完整最流行 AOP 框架.在 Spring2.0 以上版本中, 可以使用基于 AspectJ 注解或基于 XML 配置 AOP。...将 throwing 属性添加到 @AfterThrowing 注解中, 也可以访问连接点抛出异常. Throwable 是所有错误和异常....如果切入点要在多个切面中共用, 最好将它们集中在一个公共中. 在这种情况下, 它们必须声明为 public. 在引入这个切入点时, 必须将名也包括在内.

    57020

    浅谈Android面向切面编程(AOP)

    2、项目场景 项目开发过程中,可能会有这样需求,需要我们在方法执行完成后,记录日志(后台开发中比较常见~),或是计算这个方法执行时间,在不使用AOP情况下,我们可以在方法最后调用另一个专门记录日志方法...本篇主角就是AspectJ,下面就来看看AspectJ方式AOP如何在Android开发中进行使用吧。...二、AspectJ引入 对于eclipse与Android Studio引入是不一样,本篇只介绍Android Studio如何引入AspectJ,eclipse请自行百度。...这不就是把切面(也就是新方法属性:通知定义)用到目标中吗 目标(target) 引入中所提到目标,也就是要被通知对象,也就是真正业务逻辑,他可以在毫不知情情况下,咋们织入切面。...先来试试看,这几个注解执行结果如何

    89520

    Spring学习笔记(四)——Spring中AOP

    InvocationHandler:用于提供增强代码 它是让我们写如何代理。我们一般都是些一个该接口实现,通常情况下都是匿名内部类,但不是必须。此接口实现都是谁用谁写。...基于子类动态代 提供者:第三 CGLib,如果报 asmxxxx 异常,需要导入 asm.jar。 要求:代理不能用 final 修饰(最终)。...Callback:用于提供增强代码 它是让我们写如何代理。我们一般都是些一个该接口实现,通常情况下都是匿名内部类,但不是必须。 此接口实现都是谁用谁写。...spring 采用动态代理织入, AspectJ 采用编译期织入和装载期织入。 Proxy(代理): 一个 AOP 织入增强后,就产生一个结果代理。...; import org.aspectj.lang.ProceedingJoinPoint; /** * 用于记录日志工具,它里面提供了公共代码 */ public class Logger

    28840

    SpringBoot入门建站全系列(三十六)AspectJ做AOP日志管理

    常常被用来做日志/流水存储记录。 本篇对如何使用spring-boot-starter-aop做简要说明,并补充常用表达式。...2.2 配置文件 无需额外配置。 三、SpringBoot应用 3.1 Service层(切面的业务逻辑层) 这里简单写一个业务逻辑,内容不是重点,重点是怎么切面。...execution,直接写切点法名即可。...@AfterReturning是切方法执行后执行,可以获取到切方法返回值。...表示可省略, 修饰符模式如public、protected等; 返回类型模式表示方法返回类型; 方法名模式表示+方法; 参数模式表示参数; 异常模式表示抛出异常; 表达式中,可以使用*来代表任意字符

    1.6K30

    SpringAOP面向切面 知识点速查

    ,在初始化前后用代理对象加强原来 实现方式 预编译:AspectJ 运行期动态代理(JDK动态代理、CGLib动态代理):SpringAOP、JbossAOP AOP相关术语 jointpoint...前置通知 后置通知 异常通知(抛出异常) 最终通知(无论如何都执行) 环绕通知(方法执行前后都通知,甚至可以阻止目标方法执行) introduction(引介):特殊通知,层面的。...target(目标对象):代理目标对象 weaving(织入):把增强应用到目标对象来创建新代理对象过程 proxy(代理):AOP织入增强后产生结果代理 aspect(切面):切入点+通知结合...代理继承InvocationHandler接口使用Proxy.newProxyInstance(代理接口) CGLIB动态代理:对实现做子类增强。...final方法,不能代理,因为无法进行覆盖 JDK动态代理,是针对接口生成子类,接口中方法不能使用final修饰 CGLib是针对目标生产子类,因此类或方法不能使用final spring只支持方法连接点

    54120

    《Spring 手撸专栏》第 12 章:炉火纯青,基于JDK和Cglib动态代理,实现AOP核心功能

    看设计模式,看时候懂,但改自己代码又下不去手。其实一面是本身技术栈知识面不足,另外一面是自己储备代码也不够。...,那么有了一个基本思路后,接下来就需要考虑下怎么给方法做代理呢,不是代理。...另外怎么去代理所有符合某些规则所有中方法呢。如果可以代理掉所有方法,就可以做一个方法拦截器,给所有代理方法添加上一些自定义处理,比如打印日志、记录耗时、监控异常等。...那么我们就需要先来实现一个可以代理方法 Proxy,其实代理方法主要是使用到方法拦截器处理方法调用 MethodInterceptor#invoke,不是直接使用 invoke 方法中入参 Method...ASM 字节码增强技术处理对象代理对象生成,因此代理不需要实现任何接口。

    28820
    领券