我创建了非常基本的aspectJ项目。我不知道为什么不能应用建议。
注释
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Conditional {
String value();
}
和aspectJ类:
@Aspect
public class AspectE {
@Around("call(@Conditional * *.*(..)) && @annotation(conditional)" )
public Object condition(ProceedingJoinPoint joinPoint, Conditional conditional) throws Throwable {
System.out.println("entry point says hello!");
return joinPoint.proceed();
}
}
主:
public class Main {
@Conditional("")
public static void main(String[] args) {
System.out.println("main good morning");
}
}
你能告诉我接收这两条消息应该改变什么吗?
答案 0 :(得分:1)
我认为这是因为call(@Conditional * *.*(..))
基本上编织了调用者,在这种特定情况下调用者是命令行,因此没有编织发生。
您可能应该将其更改为执行,这应该可以。
@Around("execution(@Conditional * *.*(..)) && @annotation(conditional)" )
答案 1 :(得分:0)
您应该使用AspectJ weaver将方面AspectE
应用于Java类Main
。如果您使用的是Maven,我建议您使用aspectj-maven-plugin。
答案 2 :(得分:0)
您的建议必须proceed(conditional)
,或者,如果您不需要绑定到变量的对象,请删除绑定。
你的切入点匹配问题是你的应用程序中没有调用main
(Java命令行就是这样)的地方,只有执行方法的地方,所以你想改变它切入execution(@Conditional * *.*(..))
的部分内容。
为了简化操作,您可以删除切入点的任何一部分,因为两者都会匹配,而不会通过&&
进行冗余连接。
因此,简单的AspectJ语法中最简单的方面版本是:
public aspect AspectE {
Object around() : @annotation(Conditional) {
System.out.println("entry point says hello!");
return proceed();
}
}