package net.thucydides.core.annotations; import com.google.common.base.Optional; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * Find the annotated fields in a given class. * Used as a utility class for the higher-level annotation processing. * Typical use: * <pre> * <code> * for (Field field : Fields.of(someClass).allFields()) { * ... * } * </code> * </pre> */ public class Fields { private final Class<?> clazz; public static Fields of(final Class<?> testClass) { return new Fields(testClass); } private Fields(Class<?> clazz) { this.clazz = clazz; } public Set<Field> allFields() { Set<Field> fields = new HashSet<Field>(); fields.addAll(Arrays.asList(clazz.getDeclaredFields())); fields.addAll(Arrays.asList(clazz.getFields())); if (clazz != Object.class) { fields.addAll(Fields.of(clazz.getSuperclass()).allFields()); } return fields; } public Set<Field> nonStaticFields() { Set<Field> fields = allFields(); Set<Field> nonStaticFields = new HashSet<Field>(); for(Field field : fields) { if (!Modifier.isStatic(field.getModifiers())) { nonStaticFields.add(field); } } return nonStaticFields; } public Optional<Field> withName(String pages) { for(Field field : allFields()) { if (field.getName().equals(pages)){ return Optional.of(field); } } return Optional.absent(); } }