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 FrameworkField(Field field) { 019 if (field == null) { 020 throw new NullPointerException( 021 "FrameworkField cannot be created without an underlying field."); 022 } 023 this.field = field; 024 025 if (isPublic()) { 026 // This field could be a public field in a package-scope base class 027 try { 028 field.setAccessible(true); 029 } catch (SecurityException e) { 030 // We may get an IllegalAccessException when we try to access the field 031 } 032 } 033 } 034 035 @Override 036 public String getName() { 037 return getField().getName(); 038 } 039 040 public Annotation[] getAnnotations() { 041 return field.getAnnotations(); 042 } 043 044 public <T extends Annotation> T getAnnotation(Class<T> annotationType) { 045 return field.getAnnotation(annotationType); 046 } 047 048 @Override 049 public boolean isShadowedBy(FrameworkField otherMember) { 050 return otherMember.getName().equals(getName()); 051 } 052 053 @Override 054 boolean isBridgeMethod() { 055 return false; 056 } 057 058 @Override 059 protected int getModifiers() { 060 return field.getModifiers(); 061 } 062 063 /** 064 * @return the underlying java Field 065 */ 066 public Field getField() { 067 return field; 068 } 069 070 /** 071 * @return the underlying Java Field type 072 * @see java.lang.reflect.Field#getType() 073 */ 074 @Override 075 public Class<?> getType() { 076 return field.getType(); 077 } 078 079 @Override 080 public Class<?> getDeclaringClass() { 081 return field.getDeclaringClass(); 082 } 083 084 /** 085 * Attempts to retrieve the value of this field on {@code target} 086 */ 087 public Object get(Object target) throws IllegalArgumentException, IllegalAccessException { 088 return field.get(target); 089 } 090 091 @Override 092 public String toString() { 093 return field.toString(); 094 } 095 }