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    }