package gov.samhsa.acs.common.util; import static java.util.stream.Collectors.toSet; import java.lang.reflect.Field; import java.util.Arrays; import java.util.Collections; import java.util.Set; import java.util.concurrent.atomic.LongAdder; public class ReflectionUtils { public static final <C, T> Set<T> getFieldValuesOfTypeAsUnmodifiableSet( Class<C> clazz, Class<T> fieldType) { final LongAdder counter = new LongAdder(); final Set<T> set = Collections.unmodifiableSet(Arrays .stream(clazz.getDeclaredFields()) .filter(field -> field.getType() == fieldType) .map(field -> getFieldValueOfType(field, fieldType)) .peek(field -> counter.increment()).collect(toSet())); if (set.size() != counter.intValue()) { throw new IllegalStateException("Duplicate values in " + clazz + " fields of type " + fieldType); } return set; } @SuppressWarnings("unchecked") private static final <T> T getFieldValueOfType(Field field, Class<T> fieldType) { try { return (T) field.get(fieldType); } catch (IllegalArgumentException | IllegalAccessException e) { throw new IllegalArgumentException(e); } } }