好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

如何获得spring代理对象的原对象

获得spring代理对象的原对象

看代码吧:

?

1

2

3

4

5

6

7

8

@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

   }

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

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

         }

     }

}

从Aop代理的对象中获取源对象

 

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

/**

      * 从AOP代理对象中获得原对象的类型

      * @param proxyObject

      * @return

      */

     @SuppressWarnings ( "unchecked" )

     public static final <T> T getBeanFromProxy(T proxyObject) {

         Class<?> clazz = proxyObject.getClass();

         if (clazz.getName().startsWith( "$Proxy" )) {

             try {

                 clazz = clazz.getSuperclass();

                 Field hField = clazz.getDeclaredField( "h" );

                 hField.setAccessible( true );

                 Object hObject = hField.get(proxyObject);

 

                 Class<?> dynamicProxyClass = hObject.getClass();

                 Field advisedField = dynamicProxyClass.getDeclaredField( "advised" );

                 advisedField.setAccessible( true );

                 Object advisedObject = advisedField.get(hObject);

 

                 Class<?> advisedSupportClass = advisedObject.getClass().getSuperclass().getSuperclass();

                 Field targetField = advisedSupportClass.getDeclaredField( "targetSource" );

                 targetField.setAccessible( true );

                 Object targetObject = targetField.get(advisedObject);

 

                 Class<?> targetSourceClass = targetObject.getClass();

                 Field targetClassField = targetSourceClass.getDeclaredField( "target" );

                 targetClassField.setAccessible( true );

                 return (T) targetClassField.get(targetObject);

             } catch (SecurityException e) {

                 e.printStackTrace();

             } catch (NoSuchFieldException e) {

                 e.printStackTrace();

             } catch (IllegalArgumentException e) {

                 e.printStackTrace();

             } catch (IllegalAccessException e) {

                 e.printStackTrace();

             }

         }

         return null ;

     }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://HdhCmsTestcnblogs测试数据/nnavvi/p/7508570.html

查看更多关于如何获得spring代理对象的原对象的详细内容...

  阅读:18次