package org.resthub.common.util; import org.springframework.aop.support.AopUtils; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; /** * Utility class to work with classes. */ public abstract class ClassUtils { /** * Private constructor to prevent instantiation. */ private ClassUtils() { } public static Class<?> getGenericTypeFromBean(Object object) { Class<?> clazz = object.getClass(); if (AopUtils.isAopProxy(object)) { clazz = AopUtils.getTargetClass(object); } return getGenericType(clazz); } public static Class<?> getGenericType(Class<?> clazz) { return getGenericType(clazz, 0); } /** * Returns the generic type with the given index from the given {@link Class}. * Scan all base classes until finding a generic type. * * @param clazz Class where seeking the generic type * @param index index of the generic type to find in the actual type array * @return the generic type */ public static Class<?> getGenericType(Class<?> clazz, int index) { Type genericSuperclass = clazz.getGenericSuperclass(); if (genericSuperclass == null) { return null; } Class<?> effectiveClass = clazz; while (!(genericSuperclass instanceof ParameterizedType)) { effectiveClass = effectiveClass.getSuperclass(); genericSuperclass = effectiveClass.getGenericSuperclass(); if (effectiveClass.equals(Object.class)) { return null; } } return (Class<?>) ((ParameterizedType) genericSuperclass).getActualTypeArguments()[index]; } }