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