企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
``` /** * @author 张跃帅 * @Description: 获取代理原始对象-工具 * @date 2020/08/12 */ public class AopTargetUtil { /** * 获取被代理的对象本身 */ public static Object getTarget(Object proxy) { // 判断是不是代理对象,如果不是直接返回 if (!AopUtils.isAopProxy(proxy)) { // 返回 return proxy; } try { // 判断是否jdk动态代理 if (AopUtils.isJdkDynamicProxy(proxy)) { // 返回 return getJdkDynamicProxyTargetObject(proxy); } else { // 返回 return getCglibProxyTargetObject(proxy); } } catch (Exception e) { return null; } } /** * 获取Cglib代理目标对象 */ private static Object getCglibProxyTargetObject(Object proxy) throws Exception { // 获取声明字段 Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0"); // 设置可访问 h.setAccessible(true); // 获取aop代理 Object dynamicAdvisedInterceptor = h.get(proxy); // 获取声明字段 Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised"); // 设置可访问 advised.setAccessible(true); // 返回 return ((AdvisedSupport) advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget(); } /** * 获取jdk动态代理目标对象 */ private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception { // 获取声明字段 Field h = proxy.getClass().getSuperclass().getDeclaredField("h"); // 设置可访问 h.setAccessible(true); // 获取aop代理 AopProxy aopProxy = (AopProxy) h.get(proxy); // 获取声明字段 Field advised = aopProxy.getClass().getDeclaredField("advised"); // 设置可访问 advised.setAccessible(true); // 返回 return ((AdvisedSupport) advised.get(aopProxy)).getTargetSource().getTarget(); } }