1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.runners.model;
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.annotation.Annotation;
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport java.lang.reflect.Field;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.BlockJUnit4ClassRunner;
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * Represents a field on a test class (currently used only for Rules in
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * {@link BlockJUnit4ClassRunner}, but custom runners can make other uses)
11aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin *
12aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin * @since 4.7
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic class FrameworkField extends FrameworkMember<FrameworkField> {
15aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    private final Field field;
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
17aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    FrameworkField(Field field) {
18aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        if (field == null) {
19aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin            throw new NullPointerException(
20aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin                    "FrameworkField cannot be created without an underlying field.");
21aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        }
22aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        this.field = field;
23aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
25aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    @Override
26aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    public String getName() {
27aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return getField().getName();
28aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
30aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    public Annotation[] getAnnotations() {
31aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return field.getAnnotations();
32aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
34aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
35aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return field.getAnnotation(annotationType);
36aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
38aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    @Override
39aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    public boolean isShadowedBy(FrameworkField otherMember) {
40aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return otherMember.getName().equals(getName());
41aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
43aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    @Override
44aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    protected int getModifiers() {
45aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return field.getModifiers();
46aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
48aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    /**
49aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin     * @return the underlying java Field
50aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin     */
51aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    public Field getField() {
52aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return field;
53aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
54b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
55aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    /**
56aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin     * @return the underlying Java Field type
57aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin     * @see java.lang.reflect.Field#getType()
58aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin     */
59aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    @Override
60aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    public Class<?> getType() {
61aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return field.getType();
62aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
63aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin
64aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    @Override
65aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    public Class<?> getDeclaringClass() {
66aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return field.getDeclaringClass();
67aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
68b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
69aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    /**
70aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin     * Attempts to retrieve the value of this field on {@code target}
71aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin     */
72aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    public Object get(Object target) throws IllegalArgumentException, IllegalAccessException {
73aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return field.get(target);
74aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
75aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin
76aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    @Override
77aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    public String toString() {
78aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin        return field.toString();
79aeb93fc33cae3aadbb9b46083350ad2dc9aea645Paul Duffin    }
80b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}
81