SpringAopUtils.java 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package cn.iocoder.dashboard.util.sping;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import org.springframework.aop.framework.AdvisedSupport;
  4. import org.springframework.aop.framework.AopProxy;
  5. import org.springframework.aop.support.AopUtils;
  6. /**
  7. * Spring AOP 工具类
  8. *
  9. * 参考波克尔 http://www.bubuko.com/infodetail-3471885.html 实现
  10. */
  11. public class SpringAopUtils {
  12. /**
  13. * 获取代理的目标对象
  14. *
  15. * @param proxy 代理对象
  16. * @return 目标对象
  17. */
  18. public static Object getTarget(Object proxy) throws Exception {
  19. // 不是代理对象
  20. if (!AopUtils.isAopProxy(proxy)) {
  21. return proxy;
  22. }
  23. // Jdk 代理
  24. if (AopUtils.isJdkDynamicProxy(proxy)) {
  25. return getJdkDynamicProxyTargetObject(proxy);
  26. }
  27. // Cglib 代理
  28. return getCglibProxyTargetObject(proxy);
  29. }
  30. private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
  31. Object dynamicAdvisedInterceptor = BeanUtil.getFieldValue(proxy, "CGLIB$CALLBACK_0");
  32. AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(dynamicAdvisedInterceptor, "advised");
  33. return advisedSupport.getTargetSource().getTarget();
  34. }
  35. private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
  36. AopProxy aopProxy = (AopProxy) BeanUtil.getFieldValue(proxy, "h");
  37. AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(aopProxy, "advised");
  38. return advisedSupport.getTargetSource().getTarget();
  39. }
  40. }