import java.lang.reflect.Proxy;
public class ProxyUtils {
public static final String GUICE_PROXY_FLAG = "$EnhancerByGuice$";
public static final String CGLIB_PROXY_FLAG = "$EnhancerByCGLIB$";
private ProxyUtils() {}
public static boolean isGuiceProxy(Class clazz) {
return (clazz != null) && clazz.getName().contains(GUICE_PROXY_FLAG);
}
public static boolean isCglibProxy(Class clazz) {
return (clazz != null) && clazz.getName().contains(CGLIB_PROXY_FLAG);
}
public static Class getRawClass(Object value) {
if (null == value) {
return null;
}
if (value instanceof ValueHolder) {
return getRawClassFromGuiceProxy(((ValueHolder) value).getImplClass());
}
return isGuiceProxy(value.getClass())
? getRawClassFromGuiceProxy(value.getClass().getSuperclass())
: value.getClass();
}
public static Class getRawClassFromGuiceProxy(final Class clazz) {
if (!isGuiceProxy(clazz)) {
return clazz;
}
Class rawClass;
do {
rawClass = clazz.getSuperclass();
} while (rawClass.getName().contains(GUICE_PROXY_FLAG));
return rawClass;
}
public static Class getRawClassFromProxy(final Class clazz) {
if (isCglibProxy(clazz) || isGuiceProxy(clazz)) {
return getRawClassFromProxy(clazz.getSuperclass());
}
return clazz;
}
}