博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在spring中获取代理对象代理的目标对象工具类
阅读量:7031 次
发布时间:2019-06-28

本文共 1829 字,大约阅读时间需要 6 分钟。

hot3.png

通过此种方式获取目标对象是不可靠的,或者说任何获取目标对象的方式都是不可靠的,因为TargetSource,TargetSource中存放了目标对象,但TargetSource有很多种实现,默认我们使用的是SingletonTargetSource ,但还有其他的比如ThreadLocalTargetSource、CommonsPoolTargetSource 等等

 

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;	}	}

 

转载于:https://my.oschina.net/u/2350399/blog/756624

你可能感兴趣的文章
gRPC-Web发布,REST又要被干掉了?
查看>>
全站爬虫项目一阶段总结
查看>>
在项目中引入领域驱动设计的经验
查看>>
用关系型NoSQL回到未来
查看>>
Jeff Bean谈Flink与流式处理的5大新发现
查看>>
技术寡头争霸传之:控制开源工具,就控制了整个生态
查看>>
微软把UWP定位成业务线应用程序开发平台
查看>>
2018腾讯云+未来峰会互联网专场:腾讯云智能物联解决方案亮相
查看>>
Python数据可视化的10种技能
查看>>
关于有效的性能调优的一些建议
查看>>
微软发起Java on Azure调查,呼吁Java社区积极参与
查看>>
搭建svn仓库
查看>>
JavaScript arguments 对象详解
查看>>
[elixir! #0002] [译] 在Phoenix中实现动态表单 by José Valim
查看>>
【windows docker & centos 6 .7搭建】
查看>>
Firefox插件开发:夜间模式
查看>>
这是我第一次遇到判断ios系统版本的问题
查看>>
漏洞战争: 软件漏洞发展趋势
查看>>
数人云CTO解读Docker 1.12和金融业容器化
查看>>
PyMongo 连接问题
查看>>