001package org.junit.runners.model;
002
003import java.lang.annotation.Annotation;
004import java.lang.reflect.Field;
005import java.util.List;
006
007import 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 */
015public 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}