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