package fr.openwide.core.jpa.business.generic.util; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import fr.openwide.core.jpa.business.generic.model.GenericEntity; public final class GenericEntityUtils { public static Class<?> getGenericEntityClassFromComponentDefinition(Class<?> clazz) { int retriesCount = 0; while(true) { if (clazz.getGenericSuperclass() instanceof ParameterizedType) { Type[] argumentTypes = ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments(); for (Type argumentType : argumentTypes) { Class<?> argumentClass; if (argumentType instanceof ParameterizedType) { argumentClass = (Class<?>) ((ParameterizedType) argumentType).getRawType(); } else { argumentClass = (Class<?>) argumentType; } if (GenericEntity.class.isAssignableFrom(argumentClass)) { return argumentClass; } } } clazz = clazz.getSuperclass(); retriesCount ++; if (retriesCount > 5) { throw new IllegalArgumentException("Unable to find a generic type extending GenericEntity."); } } } private GenericEntityUtils() { } }