【问题标题】:Aspectj overwrite an argument of a methodAspectj 覆盖方法的参数
【发布时间】:2010-11-30 09:33:58
【问题描述】:

我正在开发一个方面,它检查 setter 方法的参数并用空值覆盖空字符串。这是我目前的状态:

@Before("execution(* de.foo.entity.*.set*(..)) && args(java.lang.String)")
public void check(final JoinPoint jp) {
    LOGGER.debug(jp.getSignature().toLongString());
    Object[] args = jp.getArgs();
    for (int i = 0; i < args.length; i++) {
        if (args[i] instanceof String && ((String) args[i]).isEmpty()) {
            args[i] = null;
        }
    }
}

不幸的是,覆盖语句args[i] = null; 现在可以工作了!有谁知道我应该如何覆盖它?

干杯,

凯文

【问题讨论】:

  • @Kevin btw 你可以用这个if("".equals(args[i]))替换这个if (args[i] instanceof String &amp;&amp; ((String) args[i]).isEmpty())
  • 谢谢,是不是更快了?可能是因为选角?
  • 我认为性能方面没有太大差异,但我的版本更具可读性,因此更不容易出错

标签: java aop aspectj spring-aop


【解决方案1】:

我相信您必须实施环绕建议,而不是之前建议。

因为您可以继续使用新参数:

proceed(newArgs);

【讨论】:

  • 谢谢,为什么我必须执行周围的建议而不是之前的建议?除了通过周围的建议我能够控制方法的执行、捕获异常并检查返回值之外,区别在哪里?
  • 前通知获取参数数组的副本,但它不能修改原始参数。这就是周围建议的用途。拉尔夫:+1
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2014-08-11
  • 2012-02-13
  • 1970-01-01
相关资源
最近更新 更多