001package org.junit.runners.model;
002
003import java.lang.annotation.Annotation;
004import java.lang.reflect.Field;
005
006import 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 */
014public class FrameworkField extends FrameworkMember<FrameworkField> {
015    private final Field field;
016
017    FrameworkField(Field field) {
018        if (field == null) {
019            throw new NullPointerException(
020                    "FrameworkField cannot be created without an underlying field.");
021        }
022        this.field = field;
023    }
024
025    @Override
026    public String getName() {
027        return getField().getName();
028    }
029
030    public Annotation[] getAnnotations() {
031        return field.getAnnotations();
032    }
033
034    public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
035        return field.getAnnotation(annotationType);
036    }
037
038    @Override
039    public boolean isShadowedBy(FrameworkField otherMember) {
040        return otherMember.getName().equals(getName());
041    }
042
043    @Override
044    protected int getModifiers() {
045        return field.getModifiers();
046    }
047
048    /**
049     * @return the underlying java Field
050     */
051    public Field getField() {
052        return field;
053    }
054
055    /**
056     * @return the underlying Java Field type
057     * @see java.lang.reflect.Field#getType()
058     */
059    @Override
060    public Class<?> getType() {
061        return field.getType();
062    }
063    
064    @Override
065    public Class<?> getDeclaringClass() {
066        return field.getDeclaringClass();
067    }
068
069    /**
070     * Attempts to retrieve the value of this field on {@code target}
071     */
072    public Object get(Object target) throws IllegalArgumentException, IllegalAccessException {
073        return field.get(target);
074    }
075
076    @Override
077    public String toString() {
078        return field.toString();
079    }
080}