JdkDynamicAopProxy.java 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package cn.nosum.framework.aop.proxy;
  2. import cn.nosum.framework.aop.aspect.Advice;
  3. import cn.nosum.framework.aop.support.AdvisedSupport;
  4. import java.lang.reflect.InvocationHandler;
  5. import java.lang.reflect.InvocationTargetException;
  6. import java.lang.reflect.Method;
  7. import java.lang.reflect.Proxy;
  8. public class JdkDynamicAopProxy implements AopProxy,InvocationHandler {
  9. private AdvisedSupport config;
  10. public JdkDynamicAopProxy(AdvisedSupport config) {
  11. this.config = config;
  12. }
  13. @Override
  14. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  15. Object returnValue;
  16. try {
  17. invokeAdvice(config.getAdvices(method).get("before"));
  18. returnValue = method.invoke(this.config.getTarget(),args);
  19. invokeAdvice(config.getAdvices(method).get("after"));
  20. }catch (Exception e){
  21. invokeAdvice(config.getAdvices(method).get("afterThrow"));
  22. throw e;
  23. }
  24. return returnValue;
  25. }
  26. private void invokeAdvice(Advice advice) {
  27. try {
  28. advice.getAdviceMethod().invoke(advice.getAspect());
  29. } catch (IllegalAccessException e) {
  30. e.printStackTrace();
  31. } catch (InvocationTargetException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. public Object getProxy() {
  36. return getProxy(this.config.getTargetClass().getClassLoader());
  37. }
  38. @Override
  39. public Object getProxy(ClassLoader classLoader) {
  40. return Proxy.newProxyInstance(classLoader,this.config.getTargetClass().getInterfaces(),this);
  41. }
  42. }