AOP是面向切面编程,为什么在切面中写一个注解方法@Before,这个方法会在目标方法前面执行呢
基于JDK动态代理实现上面说的情况
自定义注解
@Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) public @interface ExtBefore { String value() default ""; }
切面类,里面定义了一个注解方法
public class Aspect { @ExtBefore public void before() { System.out.println("beforeMethod ..... "); } }
测试类
private static Object getProxy(final Object target , Object aspect)
这个方法传入的是要代理的目标类,和切面类。这样就可以在目标方法前和后执行我们在切面类加了注解的方法
public class ProxyTest { public static void main(String[] args) { List target = new ArrayList<String>(); Collection proxy = (Collection)getProxy(target, new Aspect()); System.out.println(proxy.add("A")); } private static Object getProxy(final Object target , Object aspect) { Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), new Class[]{Collection.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //调用切面中before方法 Class<?> clazz = aspect.getClass(); Method[] methods = clazz.getDeclaredMethods(); for(Method m : methods) { if(m.getDeclaredAnnotation(ExtBefore.class) != null) { m.invoke(aspect); } } //目标方法 Object retVal = method.invoke(target, args); return retVal; } }); return proxy; } }