/** * Resolves implementation type based on given type, while it reflects annotation {@link ImplementedBy} in order to * determine final implementation of given type. * * @param type the type to be resolved * @return the implementation class for given type */ @SuppressWarnings("unchecked") public static <T> Class<? extends T> resolveType(Class<T> type) { ImplementedBy implementedBy = type.getAnnotation(ImplementedBy.class); if (implementedBy != null) { if (implementedBy.value() != ImplementedBy.class) { return (Class<? extends T>) resolveType(implementedBy.value()); } else if (!"".equals(implementedBy.className())) { return (Class<? extends T>) resolveType(implementedBy.className()); } else { throw new IllegalStateException( String.format( "Cannot instantiate an instance of '%s' as its %s is incomplete - it doesn't specify implementation class", type.getName(), implementedBy)); } } else { return type; } }
/** * Resolves implementation type based on given type, while it reflects annotation {@link ImplementedBy} in order to * determine final implementation of given type. * * @param type the type to be resolved * @return the implementation class for given type */ @SuppressWarnings("unchecked") public static <T> Class<? extends T> resolveType(Class<T> type) { ImplementedBy implementedBy = type.getAnnotation(ImplementedBy.class); if (implementedBy != null) { if (implementedBy.value() != ImplementedBy.class) { return (Class<? extends T>) resolveType(implementedBy.value()); } else if (!"".equals(implementedBy.className())) { return (Class<? extends T>) resolveType(implementedBy.className()); } else { throw new IllegalStateException( String.format( "Cannot instantiate an instance of '%s' as its %s is incomplete - it doesn't specify implementation class", type.getName(), implementedBy)); } } else { return type; } }