/** * collects all TypeVariable -> Type mappings from the generic interfaces */ private static void collectActualTypeArguments(final Type[] genericInterfaces, final Map<TypeVariable<?>, Type> map) { for (Type genericInterface : genericInterfaces) { if (genericInterface instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) genericInterface; collectActualTypeArguments(parameterizedType, map); Type rawType = parameterizedType.getRawType(); collectActualTypeArguments(getGenericInterfaces(rawType), map); } else { collectActualTypeArguments(getGenericInterfaces(genericInterface), map); } } }
/** * collects all TypeVariable -> Type mappings from the generic interfaces */ private static void collectActualTypeArguments(final Type[] genericInterfaces, final Map<TypeVariable<?>, Type> map) { for (Type genericInterface : genericInterfaces) { if (genericInterface instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) genericInterface; collectActualTypeArguments(parameterizedType, map); Type rawType = parameterizedType.getRawType(); collectActualTypeArguments(getGenericInterfaces(rawType), map); } else { collectActualTypeArguments(getGenericInterfaces(genericInterface), map); } } }
/** * returns an already cached [TypeVariable -> Type] map for the targetClass or build a new one. */ private static Map<TypeVariable<?>, Type> getTypeMap(final Class<?> targetClass) { // check if a TypeMap already exists for this class if (typeMaps.containsKey(targetClass)) { return typeMaps.get(targetClass); } // build a new TypeVariable -> Type map Map<TypeVariable<?>, Type> map = new HashMap<TypeVariable<?>, Type>(); Class<?> clazz = targetClass; while (!Object.class.equals(clazz)) { Type genericSuperClass = clazz.getGenericSuperclass(); if (genericSuperClass instanceof ParameterizedType) { collectActualTypeArguments((ParameterizedType) genericSuperClass, map); } collectActualTypeArguments(clazz.getGenericInterfaces(), map); clazz = clazz.getSuperclass(); } typeMaps.put(targetClass, map); return map; }
/** * returns an already cached [TypeVariable -> Type] map for the targetClass * or build a new one. */ private static Map<TypeVariable<?>, Type> getTypeMap(final Class<?> targetClass) { // check if a TypeMap already exists for this class if (typeMaps.containsKey(targetClass)) { return typeMaps.get(targetClass); } // build a new TypeVariable -> Type map Map<TypeVariable<?>, Type> map = new HashMap<TypeVariable<?>, Type>(); Class<?> clazz = targetClass; while (!Object.class.equals(clazz)) { Type genericSuperClass = clazz.getGenericSuperclass(); if (genericSuperClass instanceof ParameterizedType) { collectActualTypeArguments((ParameterizedType) genericSuperClass, map); } collectActualTypeArguments(clazz.getGenericInterfaces(), map); clazz = clazz.getSuperclass(); } typeMaps.put(targetClass, map); return map; }