У меня есть абстрактный аспект, как это:AspectJ - не может переопределить срез точек - типы параметров не совпадают
public abstract aspect GenericAspect<T> {
public abstract T createT(Object[] args);
abstract pointcut callMethod(Object[] args);
T around(Object[] args) : callMethod(args) {
return createT(args);
}
}
И я хотел бы расширить этот аспект еще один абстрактный аспект, который переопределяет только абстрактный срез точек. Как в следующем примере (где Foo является интерфейсом):
public abstract aspect FooAspect extends GenericAspect<Foo> {
pointcut callMethod(Object[] args):
call(Foo *.*(..)) && args(args);
}
Но у меня есть эта ошибка компиляции:
can't override pointcut GenericAspect.callMethod(java.lang.Object[]) with pointcut FooAspect.callMethod(java.lang.Object[]) parameter don't match
Как я могу решить эту проблему?
Спасибо, это сработало для меня. Другой возможный вариант - извлечь аргументы из совета вокруг с помощью 'Object [] args = thisJoinPoint.getArgs();' – EstevaoLuis
Ну, но тогда он становится уродливым, потому что вам нужно перебирать 'Object []', возвращенный 'getArgs' , В вашем примере вы получите свой собственный 'Object []' в качестве первого параметра метода с помощью метода Object []Args = (Object []) thisJoinPoint.getArgs() [0]; '. Я предпочитаю более безопасное решение без литья. Это также имеет преимущество ограничения соответствия pointcut методам, у которых действительно есть подпись с одним параметром 'Object []'. Не использовать 'args()', а просто 'getArgs()' означает if-else, итерацию, отливку и много байт-кодов в ненужных местах. – kriegaex