AopTargetUtils.java 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package cn.iocoder.dashboard.util;
  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. import java.lang.reflect.Field;
  7. /**
  8. * http://www.bubuko.com/infodetail-3471885.html
  9. */
  10. public class AopTargetUtils {
  11. /**
  12. * 获取 目标对象
  13. *
  14. * @param proxy 代理对象
  15. * @return
  16. * @throws Exception
  17. */
  18. public static Object getTarget(Object proxy) throws Exception {
  19. if (!AopUtils.isAopProxy(proxy)) {
  20. return proxy; //不是代理对象
  21. }
  22. if (AopUtils.isJdkDynamicProxy(proxy)) {
  23. return getJdkDynamicProxyTargetObject(proxy);
  24. } else { //cglib
  25. return getCglibProxyTargetObject(proxy);
  26. }
  27. }
  28. private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
  29. Object dynamicAdvisedInterceptor = BeanUtil.getFieldValue(proxy, "CGLIB$CALLBACK_0");
  30. AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(dynamicAdvisedInterceptor, "advised");
  31. Object target = advisedSupport.getTargetSource().getTarget();
  32. return target;
  33. }
  34. private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
  35. AopProxy aopProxy = (AopProxy) BeanUtil.getFieldValue(proxy, "h");
  36. AdvisedSupport advisedSupport = (AdvisedSupport) BeanUtil.getFieldValue(aopProxy, "advised");
  37. Object target = advisedSupport.getTargetSource().getTarget();
  38. return target;
  39. }
  40. }