这个问题之前已经解决了一部分,我问的问题建立在这个问题的答案之上 参考:Spring AOP中如何拦截元注解(annotated annotations)
上面的相关代码
package de.scrum_master.app;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Retention(RUNTIME)
@Target({ TYPE })
public @interface MetaAnnotation {}
package de.scrum_master.app;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@Retention(RUNTIME)
@Target({ TYPE })
@MetaAnnotation
public @interface MyAnnotation {}
但只有当元注释被添加到类型时,它才有效。现在希望在方法上使用注解的时候,也能被asepct拦截
下面的表达式可以拦截类型上使用的所有MetaAnnotation,但不能应用于方法
package de.scrum_master.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MetaAnnotationInterceptor {
@Before(
"execution(* *(..)) && (" +
"within(@de.scrum_master.app.MetaAnnotation *) || " +
"within(@(@de.scrum_master.app.MetaAnnotation *) *)" +
")"
)
public void myAdvice(JoinPoint thisJoinPoint){
System.out.println(thisJoinPoint);
}
}
我试过了
"注解(@de.scrum_master.app.MetaAnnotation *) || " + “注释(@(@de.scrum_master.app.MetaAnnotation *)*)” +
和
"@annotation(de.scrum_master.app.MetaAnnotation) || " + "@annotation(@annotation(de.scrum_master.app.MetaAnnotation))" +
还有一些类似的组合,但是都会报错:aspect expression cannot be parsed
想知道什么样的表达式可以拦截method上注解的meta注解
执行(@(@de.scrum_master.app.MetaAnnotation *)* *(..))
经过多次尝试,使用这个表达式可以完成上述功能