🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
``` /** * @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(); } }