View Javadoc

1   package org.sourceforge.jemm.client;
2   
3   import java.lang.reflect.Field;
4   import java.util.ArrayList;
5   import java.util.Arrays;
6   import java.util.Iterator;
7   import java.util.List;
8   
9   /**
10   * An Iterator that iterates all fields on a class, including
11   * all the parent classes.
12   * 
13   * @author Paul Keeble
14   *
15   */
16  public class FieldIterator implements Iterator<Field>,Iterable<Field> {
17  	Iterator<Field> fields;
18  	
19  	public FieldIterator(Class<?> clazz) {
20  		this(clazz,new AcceptAllFilter());
21  	}
22  	
23  	/**
24  	 * Creates a FieldIterator which will filter all the fields it sees
25  	 * using the passed filter.
26  	 * 
27  	 * @param clazz The clazz to start looking for fields in
28  	 * @param filter The filter to use for the fields.
29  	 */
30  	public FieldIterator(Class<?> clazz,FieldFilter filter) {
31  		ClassHierarchyIterator it = new ClassHierarchyIterator(clazz);
32  		List<Field> allFields= new ArrayList<Field>();
33  		while(it.hasNext()) {
34  			List<Field> classFields = Arrays.asList(it.next().getDeclaredFields());
35  			allFields.addAll(filterFields(classFields,filter));
36  		}
37  		
38  		fields= allFields.iterator();
39  	}
40  	
41  	private List<Field> filterFields(List<Field> filterFields, FieldFilter ff) {
42  		List<Field> result = new ArrayList<Field>();
43  		for(Field f : filterFields) {
44  			if(ff.accepts(f))
45  				result.add(f);
46  		}
47  		return result;
48  	}
49  	
50  	@Override
51  	public boolean hasNext() {
52  		return fields.hasNext();
53  	}
54  
55  	@Override
56  	public Field next() {
57  		return fields.next();
58  	}
59  
60  	@Override
61  	public void remove() {
62  		fields.remove();
63  	}
64  	
65  	public static class AcceptAllFilter implements FieldFilter {
66  		@Override
67  		public boolean accepts(Field f) {
68  			return true;
69  		}
70  		
71  	}
72  
73  	@Override
74  	public Iterator<Field> iterator() {
75  		return this;
76  	}
77  }