001 package org.junit.runners.model;
002
003 import java.lang.annotation.Annotation;
004 import java.lang.reflect.Field;
005 import java.util.List;
006
007 import org.junit.runners.BlockJUnit4ClassRunner;
008
009 /**
010 * Represents a field on a test class (currently used only for Rules in
011 * {@link BlockJUnit4ClassRunner}, but custom runners can make other uses)
012 *
013 * @since 4.7
014 */
015 public class FrameworkField extends FrameworkMember<FrameworkField> {
016 private final Field field;
017
018 /**
019 * Returns a new {@code FrameworkField} for {@code field}.
020 *
021 * <p>Access relaxed to {@code public} since version 4.13.1.
022 */
023 public FrameworkField(Field field) {
024 if (field == null) {
025 throw new NullPointerException(
026 "FrameworkField cannot be created without an underlying field.");
027 }
028 this.field = field;
029
030 if (isPublic()) {
031 // This field could be a public field in a package-scope base class
032 try {
033 field.setAccessible(true);
034 } catch (SecurityException e) {
035 // We may get an IllegalAccessException when we try to access the field
036 }
037 }
038 }
039
040 @Override
041 public String getName() {
042 return getField().getName();
043 }
044
045 public Annotation[] getAnnotations() {
046 return field.getAnnotations();
047 }
048
049 public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
050 return field.getAnnotation(annotationType);
051 }
052
053 @Override
054 public boolean isShadowedBy(FrameworkField otherMember) {
055 return otherMember.getName().equals(getName());
056 }
057
058 @Override
059 boolean isBridgeMethod() {
060 return false;
061 }
062
063 @Override
064 protected int getModifiers() {
065 return field.getModifiers();
066 }
067
068 /**
069 * @return the underlying java Field
070 */
071 public Field getField() {
072 return field;
073 }
074
075 /**
076 * @return the underlying Java Field type
077 * @see java.lang.reflect.Field#getType()
078 */
079 @Override
080 public Class<?> getType() {
081 return field.getType();
082 }
083
084 @Override
085 public Class<?> getDeclaringClass() {
086 return field.getDeclaringClass();
087 }
088
089 /**
090 * Attempts to retrieve the value of this field on {@code target}
091 */
092 public Object get(Object target) throws IllegalArgumentException, IllegalAccessException {
093 return field.get(target);
094 }
095
096 @Override
097 public String toString() {
098 return field.toString();
099 }
100 }