java - 使用 AspectJ 了解调用者类

标签 java spring aspectj

我正在尝试模仿 Spring 的 AspectJ @Async support但是有一个消息总线。

问题是我需要知道是我的消息总线 (RabbitMQ MessageListener) 正在调用该方法还是调用方法将立即返回的普通(所有其他)调用者。

我的注释称为 @MQAsync 而不是 Springs @Async。

package com.snaphop.mqueue;

import org.apache.log4j.Logger;
import com.snaphop.mqueue.MQAsync;

public aspect MQAsyncAspect {

    //pointcut asyncTypeMarkedMethod() : execution(@MQAsync void *(..));
    pointcut asyncTypeMarkedMethod() : call(@MQAsync void *(..));

    private static final Logger log = Logger.getLogger("MQAsync");

    Object around() : asyncTypeMarkedMethod() {     
        if (listenerIsCaller) {
            return proceed();
        }
        //Send the method parameters to the message bus.
        //this logic isn't here for brevity.
        return null;
    }
}

call 切入点将为我提供调用者上下文,但这将不起作用,因为我将通过反射使用我的消息监听器调用该方法。 执行 切入点(已注释掉)不会告诉我谁在调用该方法。

有没有办法通过某种堆栈转储分析来确定调用者类?

最佳答案

实际上,cheeken 的回答很好,但是对于 AspectJ call() 切入点,您可以更轻松地获得调用类,并且没有丑陋的反射:

thisEnclosingJoinPointStaticPart.getSignature().getDeclaringType()

如果您认为这个答案比另一个更好,请考虑接受这个答案,否则请享受 AspectJ 的强大功能。 ;-)

关于java - 使用 AspectJ 了解调用者类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10924675/

相关文章:

java - 用于内部方法和私有(private)方法的 AOP Java

java - 当我实例化一个类并将其强制转换为该类正在实现的接口(interface)时,为什么会出现 ClassCastException?

java - 如何在写入文件时压缩文件?

jquery - 您如何使用 jquery 更新选择的所有选项

java - 继承方法的切入点(在与类设计无关的上下文中)

java - AspectJ 之前可以从方法返回吗?

java - 从列表中遍历并查找对象字段的最佳方法

java.lang.IllegalArgumentException : The character [_] is never valid in a domain name

java - 如何在没有 Controller 类的情况下对 spring mvc 拦截器进行单元测试

java - 使用 Spring 的第 3 方单例类的依赖注入(inject)