【问题标题】:Intercept default method of the interface with returning value拦截带返回值的接口默认方法
【发布时间】:2019-05-11 16:13:54
【问题描述】:

我想在返回值后拦截方法。

该方法是接口上的默认方法,我希望返回默认 intf 实现的值,并覆盖具体类中的实现。

这是我的方面:

@Aspect
@Configuration
public class ResAspect {

    @AfterReturning(pointcut = "within(org.my.app.Strategy+) && execution(* shouldEnter(..))", returning = "res")
    public void shouldOperate(JoinPoint jp, boolean res) {
        System.out.println();
    }
}

这是默认方法:

    default boolean shouldEnter(int i, Rec r) {
        return !evaluate(i, r);
    }

你可以猜到它不起作用。那么我可以用 Spring AOP 实现我想要的吗?

我可以访问实现类实例及其在方面内的属性吗?

编辑:我要拦截的接口位于另一个模块中

【问题讨论】:

  • 对于您的第一个问题,您想访问接口中默认方法及其覆盖版本的结果吗?如果是这样,我能想到的唯一方法是使用 @Around 拦截调用,获取目标对象然后调用超级方法并获取其结果(我没有尝试过,但我认为它应该可以工作)然后继续并获取覆盖版本的结果。
  • 我们现在只说默认的 intf 实现
  • 对我来说,这就像在您的示例中一样。您一定有配置问题。所以请提供一个MCVE,我可以通过编辑您的问题或提供指向 GitHub 存储库的链接来编译和运行。

标签: java spring aop


【解决方案1】:

您可以在通知中访问调用该方法的实例,也就是目标,如下所示:

YourInterface interfaceReference = (YourInterface) joinPoint.getTarget();

然后您可以使用检索到的对象访问您想要的任何内容。

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多