zoukankan      html  css  js  c++  java
  • 获取JDK动态代理/CGLIB代理对象代理的目标对象。

    问题描述::

     

    我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法一律不出现,debug后发现这个servie实例被spring替换成jdkdynmicproxy类,而不是原始对象了,,它里面只有service继承的接口方法,而没有extends 过的super class方法,怎么调用原生对象的方法!!!!!

     

    用托管的spring service类调用getClass().getName()方法,发现输出都是$proxy43这类东西!!


    import java.lang.reflect.Field;  
    import org.springframework.aop.framework.AdvisedSupport;  
    import org.springframework.aop.framework.AopProxy;  
    import org.springframework.aop.support.AopUtils;
    /**
     * Description: 能获取JDK动态代理/CGLIB代理对象代理的目标对象。
     * All Rights Reserved.
     * @version 1.0  2015-6-28 上午9:04:32  by zhangbo01@zuche.com创建
     */
    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;  
        }  
          
    }




  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/jgig11/p/5764352.html
Copyright © 2011-2022 走看看