0

我正在使用 AspectJ 注释,出于某种原因,命名切入点与匿名切入点的切入点解析范围似乎不同。

例如,在下面的代码中,如果匿名则解析相同的切入点,但命名时则不会。但是,如果我使用通配符而不是特定类型,则命名的切入点将匹配。

有什么想法吗?

import some_other_package.not_the_one_where_this_aspect_is.Account;

@Aspect
public class MyClass {


//this does not match... but matches if Account is replaced by *
@Pointcut("execution(* Account.withdraw(..)) && args(amount)")
public void withdr(double amount){}

@Before("withdr(amount)")
public void dosomething1(double amount){}


//this matches
@Before("execution(* Account.withdraw(..)) && args(amount)")
public void dosomthing2(double amount){}

}
4

1 回答 1

0

根据文档,@AspectJ 语法导入没有用。您需要完全限定类名或使用小丑。导入在您的第二种情况下有效,这是与预期行为的偏差,而不是预期的。你不能依赖它。

如果你这样做,两种变体都可以工作:

@Aspect
public class AccountInterceptor {
    @Pointcut("execution(* *..Account.withdraw(..)) && args(amount)")
    public void withdraw(double amount) {}

    @Before("withdraw(amount)")
    public void doSomething1(JoinPoint joinPoint, double amount) {
        System.out.println(joinPoint + " -> " + amount);
    }

    @Before("execution(* *..Account.withdraw(..)) && args(amount)")
    public void doSomething2(JoinPoint joinPoint, double amount) {
        System.out.println(joinPoint + " -> " + amount);
    }
}
于 2013-04-04T11:52:21.120 回答