AOP Annotation
File: Main.java 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; import org.springframework.aop.Advisor; import org.springframework.aop.AfterReturningAdvice; import org.springframework.aop.MethodBeforeAdvice; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.annotation.AnnotationMatchingPointcut; public class Main { public static void main(String[] args) { SampleBean target = new SampleBean(); AnnotationMatchingPointcut pc = new AnnotationMatchingPointcut(null, SimpleAnnotation.class); Advisor advisor = new DefaultPointcutAdvisor(pc, new SimpleBeforeAdvice()); ProxyFactory pf = new ProxyFactory(); pf.setTarget(target); pf.addAdvisor(advisor); SampleBean proxy = (SampleBean) pf.getProxy(); proxy.getName(); proxy.getHeight(); } } class SimpleBeforeAdvice implements MethodBeforeAdvice { public void before(Method method, Object[] args, Object target) throws Throwable { System.out.println("Before method " + method); } } @SimpleAnnotation class SampleBean { @SimpleAnnotation public String getName() { return "AAA"; } public void setName(String name) { } public int getHeight() { return 201; } } @Target( { ElementType.METHOD, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @interface SimpleAnnotation { } class AnnotationAfterAdvice implements AfterReturningAdvice { public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable { System.out.print("After annotated method: " + method); } }