1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.runners.model;
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.annotation.Annotation;
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Field;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Modifier;
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.BlockJUnit4ClassRunner;
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * Represents a field on a test class (currently used only for Rules in
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * {@link BlockJUnit4ClassRunner}, but custom runners can make other uses)
12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic class FrameworkField extends FrameworkMember<FrameworkField> {
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final Field fField;
15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	FrameworkField(Field field) {
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fField= field;
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public String getName() {
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return getField().getName();
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Annotation[] getAnnotations() {
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return fField.getAnnotations();
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public boolean isPublic() {
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		int modifiers= fField.getModifiers();
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return Modifier.isPublic(modifiers);
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public boolean isShadowedBy(FrameworkField otherMember) {
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return otherMember.getName().equals(getName());
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public boolean isStatic() {
40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		int modifiers= fField.getModifiers();
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return Modifier.isStatic(modifiers);
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @return the underlying java Field
46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Field getField() {
48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return fField;
49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @return the underlying Java Field type
53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @see java.lang.reflect.Field#getType()
54b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
55b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Class<?> getType() {
56b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return fField.getType();
57b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
60b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * Attempts to retrieve the value of this field on {@code target}
61b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
62b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Object get(Object target) throws IllegalArgumentException, IllegalAccessException {
63b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return fField.get(target);
64b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
65b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}
66