Java 如何编写适当的切入点以匹配接口返回对象?

Java 如何编写适当的切入点以匹配接口返回对象?,java,aspectj,aspect,pointcut,Java,Aspectj,Aspect,Pointcut,我不知道这是否可行,但我正在尝试编写一个切入点,它将匹配任何返回实现特定接口的对象的方法 鉴于以下情况: public class User implements Auditable{ private int id; private String name; public String getName(){ return name; } } 以及可审核的接口: public interface Auditable{ public String ge

我不知道这是否可行,但我正在尝试编写一个切入点,它将匹配任何返回实现特定接口的对象的方法

鉴于以下情况:

public class User implements Auditable{
   private int id;

   private String name;

   public String getName(){
      return name;
   }
}
以及可审核的接口:

public interface Auditable{
   public String getName();
}
还有一些随机类:

public class RandomClass{
    public User getNewUser(){
       User u = new User();
       return u;
    }
}
我如何编写一个“AfterReturning”切入点来捕获实现Auditable的任何名为getNew*的方法

以下工作:

pointcut auditablePointcut(): call(public * *.getNew*(..))
但是,这将匹配任何返回类型。以下操作不起作用:

pointcut auditablePointcut(): call(public Auditable *.getNew*(..))

我想我可以使用if()编写它,但这似乎有点笨拙(我还没有尝试过)。或者有更优雅的方式吗?

我不确定切入点,但您可以在如下方面检查方法的返回类型:

MethodSignature signature = (MethodSignature)joinPoint.getSignature();
signature.getReturnType(); // method return type

after()返回(Audible au):调用(public**.getNew*(..)

能否添加一些解释?
after()返回(Audible au)
将只匹配返回
Audible
的切入点
au
将作为建议正文中的一个变量提供。为什么这与call(public Auditable*.getNew*(..)不同?它们不是都指向返回Auditable的方法吗?或者,当您提出的解决方案与返回的实际对象匹配时,这是否与精确的方法签名匹配?
call(public Audible…
与签名匹配,并且不捕获返回对象(除非在切入点中的其他位置执行此操作)。return(Audible)应该匹配并捕获返回的对象,但是切入点将应用于所有
getNew*
方法,因为没有对签名进行过滤(除了名称)。