我有一个@Around
注释处理器,它扩展了一个基类,它有一些注释处理方法。基类采用一些泛型类类型,因此它可以在一些受保护的方法和抽象方法定义中使用它们。
如果抽象方法(在子类中使用@Around
注释修饰)在其定义中使用了一个泛型类型,那么子类实现将被调用两次。
基础抽象类:
public abstract class AnnotationProcessor<TargetType, AnnotationType extends Annotation> {
public abstract Object processAnnotation(ProceedingJoinPoint joinPoint, TargetType targetType) throws Throwable;
protected AnnotationType getAnnotationSettings(JoinPoint joinPoint, Class<AnnotationType> type) throws AnnotationProcessingException
{
//...elided... do some stuff
}
}
子类:
@Aspect
@Component
public class SubProcessing extends AnnotationProcessor<HasSomeInfo, MyAnnotation> {
@Override
@Around("@annotation(MyAnnotation) && target(hasSomeInfo)")
public Object processAnnotation(ProceedingJoinPoint joinPoint, HasSomeInfo hasSomeInfo) throws Throwable
{
//Run their method
Object methodReturn = joinPoint.proceed();
//Get the annotation so we can use its values
MyAnnotation annotation = getAnnotationSettings( joinPoint, MyAnnotation.class);
System.out.println( "Called " + hasSomeInfo.getInfo() );
System.out.println( annotation.value());
//We're not changing the return
return methodReturn;
}
}
如果我将抽象类更改为不包含TargetType
并删除抽象方法,则只调用一次。
如何保留基类的泛型和抽象方法,但阻止它被调用两次?
注意:我也尝试过以下操作,但它仍然被调用了两次:
@Around("execution(* *(..)) && @annotation(MyAnnotation) && target(hasSomeInfo)")