2

我创建了非常基本的 aspectJ 项目。我不知道为什么不能应用建议。

注解

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.METHOD)  
@Documented  
public @interface Conditional {  
    String value();  
}  

和方面J类:

@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");
    }
}

你能告诉我我应该改变什么来接收这两条消息吗?

4

3 回答 3

2

我认为这是因为call(@Conditional * *.*(..))它基本上编织了调用者,在这种特定情况下的调用者是命令行,所以没有编织发生。

您可能应该将其更改为执行,这应该可以。

@Around("execution(@Conditional * *.*(..)) && @annotation(conditional)" )

于 2012-08-21T12:03:01.893 回答
0

您应该使用AspectJ weaver将您的方面应用AspectE到 Java 类Main。如果您使用的是 Maven,我建议您使用aspectj-maven-plugin

于 2012-08-21T11:39:32.797 回答
0
  1. 您的建议必须proceed(conditional),或者,如果您不需要将对象绑定到变​​量,请删除绑定。

  2. 您的切入点匹配问题是应用程序内部没有调用main的地方(Java 命令行执行此操作),只有执行方法的地方,因此您想将切入点的那部分更改为execution(@Conditional * *.*(..)).

  3. 为简化起见,您可以删除切入点的任一部分,因为这两个切入点都将匹配,而无需通过&&.

因此,AspectJ 语法中最简单的切面版本是:

public aspect AspectE {
    Object around() : @annotation(Conditional) {
        System.out.println("entry point says hello!");
        return proceed();
    }
}
于 2012-08-21T12:17:55.723 回答