import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Method; public class Test { /** * @param args */ public static void main(String[] args) throws Exception { Baz baz = new Baz(); baz.execute(); baz = new ChildOfBaz(); baz.execute(); ((ChildOfBaz) baz).execute(); } } aspect Foo { pointcut overriddenMethod(): call(@Bar * *(. .)); before(): overriddenMethod() { System.err.println(thisJoinPointStaticPart); } } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @interface Bar { String value() default ""; } class Baz { public void execute() throws Exception { Method m = getClass().getMethod("execute", null); System.err.println(m.isAnnotationPresent(Bar.class)); System.err.println(getClass().getName()); } } class ChildOfBaz extends Baz { @Bar public void execute() throws Exception { super.execute(); } }