Spring Aop中,获取被代理类的工具

在实际应用中,顺着过去就是一个类被代理。反过来,可能需要逆向进行,拿到被代理的类,实际工作中碰到了,就拿出来分享下。

 1 /**
 2      * 获取被代理类的Object
 3      * @author Monkey
 4      */
 5     public Object getTarget(Object proxy) throws Exception {
 6
 7         if(!AopUtils.isAopProxy(proxy)) {
 8             //不是代理对象
 9             return proxy;
10         }
11
12         if(AopUtils.isJdkDynamicProxy(proxy)) {
13             return getJdkDynamicProxyTargetObject(proxy);
14         } else { //cglib
15             return getCglibProxyTargetObject(proxy);
16         }
17     }  
 1 /**
 2      * CGLIB方式被代理类的获取
 3      * @author Monkey
 4      *
 5      */
 6     private Object getCglibProxyTargetObject(Object proxy) throws Exception {
 7         Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");
 8         h.setAccessible(true);
 9         Object dynamicAdvisedInterceptor = h.get(proxy);
10         Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
11         advised.setAccessible(true);
12         Object target = ((AdvisedSupport)advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget();
13         return target;
14     }  
 1 /**
 2      * JDK动态代理方式被代理类的获取
 3      * @author Monkey
 4      *
 5      */
 6     private Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
 7         Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
 8         h.setAccessible(true);
 9         AopProxy aopProxy = (AopProxy) h.get(proxy);
10         Field advised = aopProxy.getClass().getDeclaredField("advised");
11         advised.setAccessible(true);
12         Object target = ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();
13         return target;
14     }  

Spring Aop中,获取被代理类的工具

时间: 2024-10-14 23:02:42

Spring Aop中,获取被代理类的工具的相关文章

Spring AOP中的动态代理

0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1 JdkDynamicAopProxy 2.2 CglibAopProxy 3 总结 0  前言 前一个季度旅游TDC的Thames服务有几次宕机,根据组内原因认真查找发现是数据库事务造成的,后来把服务中的事务配置全部去掉,服务恢复正常.根据这次教训,虽然现在还是很难确定是哪一个方面的真正原因,但是激

spring aop 中获取 request

使用aop时需要request 和response 使用方法调用时 HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();一直报空指针结果在web.xml中加入一下监听即可 <listener> <listener-class>         org.springframework.web.context.r

spring中自定义注解(annotation)与AOP中获取注解

一.自定义注解(annotation) 自定义注解的作用:在反射中获取注解,以取得注解修饰的类.方法或属性的相关解释. package me.lichunlong.spring.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.R

Spring AOP中的JDK和CGLib动态代理哪个效率更高?

一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理,另一种是CGLib的方式. 自Java 1.3以后,Java提供了动态代理技术,允许开发者在运行期创建接口的代理实例,后来这项技术被用到了Spring的很多地方. JDK动态代理主要涉及java.lang.reflect包下边的两个类:Proxy和InvocationHandler.其中,Invoc

Spring中获取被代理的对象

目录 Spring中获取被代理的对象 获取Spring被代理对象什么时候可能会用到? Spring中获取被代理的对象 Spring中获取被代理的对象 ### 获取Spring被代理对象的JAVA工具类 ? Spring采用CGLIB或者JDK动态代理来实现AOP,那如何获取 被代理对象?通过ApplicationContext.getBean()获取到的对象都是 利用字节码动态生成的 增强对象,那假如我们有场景获取 被代理的对象,方式如下: (封装到工具类形式里面,直接通过getTrueTarg

Spring AOP高级——源码实现(2)Spring AOP中通知器(Advisor)与切面(Aspect)

本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/Spring%20AOP%E9%AB%98%E7%BA%A7%E2%80%94%E2%80%94%E6%BA%90%E7%A0%81%E5%AE%9E%E7%8E%B0%EF%BC%882%EF%BC%89Spring%20AOP%E4%B8%AD%E9%80%9A%E7%9F%A5%E5%99%A8%EF%BC%88Advisor

spring aop中pointcut表达式完整版

spring aop中pointcut表达式完整版 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @within @annotation @args 0. 示例代码git地址 https://gitee.com/likun_557/spring-aop-demo 1.execute表达式 拦截任意公共方法 execution(public * *(..)) 拦截以set开头的任意方法 execution(

Spring AOP中提供的种种Aspects - 并发控制

本文继续讨论ConcurrencyThrottleInterceptor(基于Spring 4.3.7).以及上一篇文章中遗留的一个关于SimpleAsyncTaskExecutor类中属性concurrencyLimit的问题. 这些都和并发控制相关.但是这里需要事先说明的一点是,这些类和实现的年代都比较久远了,比如ConcurrencyThrottleInterceptor是在2004年的Spring 1.x中就存在了,那个年代还没有JDK中的java.util.concurrent并发包.

正确理解Spring AOP中的Around advice

Spring AOP中,有Before advice和After advice,这两个advice从字面上就可以很容易理解,但是Around advice就有点麻烦了. 乍一看好像是Before advice和After advice的组合,也就是说pointcut会在joinpoint执行前后各执行一次.但是这种理解是不正确的,如果这样理解的话,就会产生这样的疑问:spring aop Around类型为什么只执行一次 ,这个帖子是我碰巧看到. 那么怎么样理解才是正确的呢?我们来看一下Spri