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
            }
        }
    }
  • 相关阅读:
    测试开发进阶之路,2020 我们砥砺同行!
    【上海/北京/杭州】七牛云工程效率部直聘
    测试开发基础|一文搞定计算机网络(一)
    点点点工程师真的要被淘汰吗?
    电商性能测试实战 | JMeter 插件 Ultimate Thread Group 完成梯度递增场景的压测
    将H264与AAC打包Ipad可播放的TS流的总结
    Ubuntu阿里云搭建Mono.net环境
    利用正则表达式排除特定字符串
    你敢不敢不要让我这么忙
    离我而去的附录H
  • 原文地址:https://www.cnblogs.com/nnavvi/p/7508570.html
Copyright © 2011-2022 走看看