package cn.nosum.framework.aop.proxy; import cn.nosum.framework.aop.aspect.Advice; import cn.nosum.framework.aop.support.AdvisedSupport; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JdkDynamicAopProxy implements AopProxy,InvocationHandler { private AdvisedSupport config; public JdkDynamicAopProxy(AdvisedSupport config) { this.config = config; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnValue; try { invokeAdvice(config.getAdvices(method).get("before")); returnValue = method.invoke(this.config.getTarget(),args); invokeAdvice(config.getAdvices(method).get("after")); }catch (Exception e){ invokeAdvice(config.getAdvices(method).get("afterThrow")); throw e; } return returnValue; } private void invokeAdvice(Advice advice) { try { advice.getAdviceMethod().invoke(advice.getAspect()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } public Object getProxy() { return getProxy(this.config.getTargetClass().getClassLoader()); } @Override public Object getProxy(ClassLoader classLoader) { return Proxy.newProxyInstance(classLoader,this.config.getTargetClass().getInterfaces(),this); } }