2013-02-25 4 views
2

Родитель класс:Как передать метод из родительского класса?

public class Animal { 
    public String name() { 
    return "my name"; 
    } 
} 

Детский класс:

public class Dog extends Animal { 
    // no methods 
} 

Я пытаюсь раскряжевка вызов Dog.name() с AspectJ, но не работает:

@Aspect 
public class Crosscut { 
    @Around("execution(* Dog.name())") 
    public Object exec(ProceedingJoinPoint point) { 
    // this point is never reached 
    } 
} 

Однако, если я добавлю дочерний метод к классу Dog, поперечные работы:

public class Dog extends Animal { 
    public String name() { 
    return super.name(); 
    } 
} 

Как написать правую поперечную кромку? Или это вообще невозможно?

ответ

1

Поскольку aspectj не создает новый метод здесь, он не сможет соответствовать Dog.name(). Что вам нужно сделать, это объявить совет по Animal.name() и использовать this(...), чтобы сделать aspectj добавлением проверки экземпляра runtime.

Попробуйте @Around("execution(* Animal.name()) && this(Dog)")

1

На самом деле jontro-й идея хороша, но решение проще в случае, если вы не зациклены на Dog, но хотите, чтобы перехватывать все name() метод Animal и его подклассы:

@Around("execution(* Animal+.name())") 
+0

спасибо, могу ли я использовать '* +. name()' для соответствия всем классам с методом 'name()'? – yegor256

+0

В этом случае вам не нужен знак плюса. ;-) – kriegaex