zoukankan      html  css  js  c++  java
  • spring 如何从代理对象中获取被代理对象

    import java.lang.reflect.Field;  
    
    import org.springframework.aop.framework.AdvisedSupport;  
    import org.springframework.aop.framework.AopProxy;  
    import org.springframework.aop.support.AopUtils;  
    
    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;  
        }  
    
    }
    
  • 相关阅读:
    办公自动化15-一次性生成多层目录
    小技巧1-查看excel中工作表(sheet)的个数
    LaTex 公式编辑
    Cpp 学习网站
    函数的凹凸性
    二项分布
    函数间断点
    霍夫丁(Hoeffding)不等式
    数域
    马尔可夫(Markov)不等式
  • 原文地址:https://www.cnblogs.com/mwss/p/12540330.html
Copyright © 2011-2022 走看看