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;  
        }  
    
    }
    
  • 相关阅读:
    <ul>下<li>的list-style属性
    js字符数组转化为数字数组
    ES6学习之— 字符串扩展(二)
    ES6学习之— 字符串扩展
    ES6学习之—— 变量的解构赋值
    ES6学习之——let和const命令
    微信小程序中cover-view踩坑总结
    uni-app 元素在交叉轴(竖直方向)的对齐方式
    uni-app元素对齐方式
    uni-app 页面导入css样式
  • 原文地址:https://www.cnblogs.com/mwss/p/12540330.html
Copyright © 2011-2022 走看看