美文网首页
获取JDK动态代理/CGLIB代理对象代理的目标对象

获取JDK动态代理/CGLIB代理对象代理的目标对象

作者: AbsurdOS | 来源:发表于2017-05-16 11:27 被阅读0次

公司基础框架是通过反射来获取controller层的,会丢失aop的东西,修改框架拿到被代理的对象就行了。

    public static Object getTarget(Object proxy) {
        if (!AopUtils.isAopProxy(proxy)) {
            return proxy;// 不是代理对象
        }
        if (AopUtils.isJdkDynamicProxy(proxy)) {
            return getJdkDynamicProxyTargetObject(proxy);
        } else { // cglib
            return getCglibProxyTargetObject(proxy);
        }
    }
private static Object getCglibProxyTargetObject(Object proxy) {
        try{
            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;
        } catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
    

    private static Object getJdkDynamicProxyTargetObject(Object proxy) {
        try{
            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;
        } catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

学习自:http://jinnianshilongnian.iteye.com/blog/1613222
mark一下

相关文章

  • jdk代理和cglib代理

    代理:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。jdk代理跟cglib代理都是动态代理...

  • 代理模式

    代理模式主要分为:静态代理,动态代理(JDK代理,接口代理)和Cglib代理(在内存中动态创建对象,不需要实现接口...

  • 获取JDK动态代理/CGLIB代理对象代理的目标对象

    公司基础框架是通过反射来获取controller层的,会丢失aop的东西,修改框架拿到被代理的对象就行了。 学习自...

  • Spring的AOP原理分析

    一 动态代理 动态代理分为JDK动态代理和CGLIB动态代理 jdk动态代理 被代理类(目标类)和代理类必须实现同...

  • 面试系列~动态代理实现与原理

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • SpringAOP源码解析过程

    spring的AOP基于JDK的动态代理和cglib实现,默认代理对象是某个接口的实现就会使用JDK动态代理,否则...

  • 代理模式(二)

    延续代理模式(一)的内容 (2)、cglib动态代理原理() JDK动态生成一个实现代理动作接口的代理对象,最后强...

  • Cglib子类代理及详细解析

    Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。 l JDK的动态代理有一个...

  • 九、spring aop之jdk动态代理

    使用 动态代理有两个对象,目标对象和代理对象。使用JDK动态代理,目标对象必须实现一个接口。 原理 要查看JDK动...

  • java动态代理

    目录: 简介 jdk动态代理 cglib动态代理 jdk动态代理与cglib的区别 应用spring的aop 简介...

网友评论

      本文标题:获取JDK动态代理/CGLIB代理对象代理的目标对象

      本文链接:https://www.haomeiwen.com/subject/qwqlxxtx.html