Python 官方文档:入门教程 => 点击学习
获得spring代理对象的原对象 看代码吧: @SuppressWarnings({"unchecked"}) protected <T> T getTargetOb
看代码吧:
@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
}
}
public class AopTargetUtils {
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
}
}
}
@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;
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: 如何获得spring代理对象的原对象
本文链接: https://www.lsjlt.com/news/130776.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0