/** * Process an existing result. * * @param result * The result. * @param type * The result type. */ private static void processExistingResult(final ParameterResult result, final Type type) { if (type instanceof Class) { final Class<?> clazz = (Class<?>) type; final TypeVariable<?>[] typeVariableSuper = clazz.getTypeParameters(); GenericsUtil.getClassMatch(clazz, typeVariableSuper, result); } else if (type instanceof ParameterizedType) { final ParameterizedType parameterizedType = (ParameterizedType) type; final Class<?> clazz = (Class<?>) parameterizedType.getRawType(); Type[] types = clazz.getTypeParameters(); GenericsUtil.getClassMatch(clazz, types, result); types = parameterizedType.getActualTypeArguments(); GenericsUtil.getClassMatch(clazz, types, result); final Type actualType = parameterizedType.getActualTypeArguments()[result.getIndex()]; if (actualType instanceof Class) { result.setResult(actualType); } else if (actualType instanceof ParameterizedType) { final ParameterizedType actualParameterizedType = (ParameterizedType) actualType; result.setResult(actualParameterizedType.getRawType()); } } }
final ParameterResult result = new ParameterResult(); result.setIndex(originatingIndex); Type typeResult = result.getResult(); while (iterator.hasNext() && !(typeResult instanceof Class)) { final Type type = iterator.next(); if (CheckUtil.isNull(typeResult)) { result.setResult(GenericsUtil.processNoResult(originatingIndex, result.getIndex(), type)); } else { GenericsUtil.processExistingResult(result, type); typeResult = result.getResult(); if (typeResult instanceof TypeVariable<?>) { final Type type = property.getGenericType(); if (type instanceof ParameterizedType) { final ParameterizedType parameterizedType = (ParameterizedType) type; result.setResult(parameterizedType.getActualTypeArguments()[result.getIndex()]); return result.getResult();
/** * Gets the generic argument of an entity type. * * @param clazz * The entity type. * @param genericParameter * The generic parameter to get. * @param targetClazz * The target of which the generic parameter is to be resolved. * @return The type of the generic parameter of the target. */ public static Type getEntityGenericType(final Class<?> clazz, final int genericParameter, final Class<?> targetClazz) { // Get the type path. final Deque<Type> typePath = GenericsUtil.findTypePath(clazz, targetClazz); final Iterator<Type> iterator = typePath.descendingIterator(); final ParameterResult result = new ParameterResult(); result.setIndex(genericParameter); Type typeResult = result.getResult(); while (iterator.hasNext() && !(typeResult instanceof Class)) { final Type type = iterator.next(); if (CheckUtil.isNull(typeResult)) { result.setResult(GenericsUtil.processNoResult(genericParameter, result.getIndex(), type)); } else { GenericsUtil.processExistingResult(result, type); } typeResult = result.getResult(); } typeResult = result.getResult(); return typeResult; }
/** * Gets the type variable match. * * @param clazz * The type. * @param typeVariableSuper * The super variables. * @param result * The result. */ private static void getClassMatch(final Class<?> clazz, final TypeVariable<?>[] typeVariableSuper, final ParameterResult result) { for (int i = 0; i < typeVariableSuper.length; i = i + 1) { if (typeVariableSuper[i].equals(result.getResult())) { result.setIndex(i); result.setResult(typeVariableSuper[i]); } } }
/** * Gets the type variable match. * * @param clazz * The type. * @param types * The super variables. * @param result * The result. */ private static void getClassMatch(final Class<?> clazz, final Type[] types, final ParameterResult result) { for (int i = 0; i < types.length; i = i + 1) { if (types[i].equals(result.getResult())) { result.setIndex(i); result.setResult(types[i]); } } }