zoukankan      html  css  js  c++  java
  • 获得spring代理对象的原对象

    @SuppressWarnings({"unchecked"})
    protected <T> T getTargetObject(Object proxy, Class<T> targetClass) throws Exception {
      if (AopUtils.isJdkDynamicProxy(proxy)) {
        return (T) ((Advised)proxy).getTargetSource().getTarget();
      } else {
        return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
      }
    }
    public class AopTargetUtils {
    
    
        /**
         * 获取 目标对象
         * @param proxy 代理对象
         * @return
         * @throws Exception
         */
        public static Object getTarget(Object proxy) throws Exception {
    
            if(!AopUtils.isAopProxy(proxy)) {
                return proxy;//不是代理对象
            }
    
            if(AopUtils.isJdkDynamicProxy(proxy)) {
                return getJdkDynamicProxyTargetObject(proxy);
            } else { //cglib
                return getCglibProxyTargetObject(proxy);
            }
    
    
    
        }
    
    
        private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
            Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");
            h.setAccessible(true);
            Object dynamicAdvisedInterceptor = h.get(proxy);
    
            Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
            advised.setAccessible(true);
    
            Object target = ((AdvisedSupport)advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget();
    
            return target;
        }
    
    
        private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
            Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
            h.setAccessible(true);
            AopProxy aopProxy = (AopProxy) h.get(proxy);
    
            Field advised = aopProxy.getClass().getDeclaredField("advised");
            advised.setAccessible(true);
    
            Object target = ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();
    
            return target;
        }
    
    
        @SuppressWarnings({"unchecked"})
        protected <T> T getTargetObject(Object proxy, Class<T> targetClass) throws Exception {
            if (AopUtils.isJdkDynamicProxy(proxy)) {
                return (T) ((Advised)proxy).getTargetSource().getTarget();
            } else {
                return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class
            }
        }
    }
  • 相关阅读:
    HDU 1394 Minimum Inversion Number
    HDU 4931 Happy Three Friends
    BZOJ 1089 严格n元树 (递推+高精度)
    BZOJ 1088 扫雷Mine (递推)
    BZOJ 3038 上帝造题的七分钟2 (并查集+树状数组)
    BZOJ 3211 花神游历各国 (树状数组+并查集)
    BZOJ 1087 互不侵犯King (位运算)
    BZOJ 1002 轮状病毒 (基尔霍夫矩阵)
    BZOJ 1005 明明的烦恼 (组合数学)
    BZOJ 1058 报表统计 (STL)
  • 原文地址:https://www.cnblogs.com/nnavvi/p/7508570.html
Copyright © 2011-2022 走看看