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
            }
        }
    }
  • 相关阅读:
    Debian8搭建LEMP环境
    ProjectManager Beta 7 项目管理器发布
    我的Linux软件集
    修改/home内子目录的名字
    Nginx配置特定二级域名
    Debian8 安装wordpress博客
    LinuxMint18使用单独分区作为Home挂载点
    LinuxMint18配置Grub2默认启动操作系统
    《失恋33天》从绝境中走出来的故事
    爱的世界很拥挤,写在读《爱,就这么简单》之后
  • 原文地址:https://www.cnblogs.com/nnavvi/p/7508570.html
Copyright © 2011-2022 走看看