package com.github.bingoohuang.springrestclient.tests.api; import org.springframework.aop.TargetSource; import java.lang.reflect.Method; public class CglibHelper { private final Object proxied; public CglibHelper(Object proxied) { this.proxied = proxied; } public Object getTargetObject() { String name = proxied.getClass().getName(); if (name.toLowerCase().contains("cglib")) { return extractTargetObject(proxied); } return proxied; } private Object extractTargetObject(Object proxied) { try { TargetSource springTargetSource = findSpringTargetSource(proxied); return springTargetSource.getTarget(); } catch (Exception e) { throw new RuntimeException(e); } } private TargetSource findSpringTargetSource(Object proxied) { Method[] methods = proxied.getClass().getDeclaredMethods(); Method targetSourceMethod = findTargetSourceMethod(methods); targetSourceMethod.setAccessible(true); try { return (TargetSource) targetSourceMethod.invoke(proxied); } catch (Exception e) { throw new RuntimeException(e); } } private Method findTargetSourceMethod(Method[] methods) { for (Method method : methods) { if (method.getName().endsWith("getTargetSource")) { return method; } } throw new IllegalStateException( "Could not find target source method on proxied object [" + proxied.getClass() + "]"); } }