今天写测试,需要对某个spring注入的类中set MOCK对象,需要获得代理的对象。
public static Object getTargetObject(Object proxy) throws Exception {
if(!AopUtils.isAopProxy(proxy)) { //判断是否是代理类
return proxy;
}
return getTargetObject(getProxyTargetObject(proxy));
}
private static Object getProxyTargetObject(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);
return ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();
}