001package org.junit.runners.model; 002 003import java.lang.reflect.Modifier; 004import java.util.List; 005 006/** 007 * Parent class for {@link FrameworkField} and {@link FrameworkMethod} 008 * 009 * @since 4.7 010 */ 011public abstract class FrameworkMember<T extends FrameworkMember<T>> implements 012 Annotatable { 013 abstract boolean isShadowedBy(T otherMember); 014 015 T handlePossibleBridgeMethod(List<T> members) { 016 for (int i = members.size() - 1; i >=0; i--) { 017 T otherMember = members.get(i); 018 if (isShadowedBy(otherMember)) { 019 if (otherMember.isBridgeMethod()) { 020 /* 021 * We need to return the previously-encountered bridge method 022 * because JUnit won't be able to call the parent method, 023 * because the parent class isn't public. 024 */ 025 members.remove(i); 026 return otherMember; 027 } 028 // We found a shadowed member that isn't a bridge method. Ignore it. 029 return null; 030 } 031 } 032 // No shadow or bridge method found. The caller should add *this* member. 033 return (T) this; 034 } 035 036 abstract boolean isBridgeMethod(); 037 038 protected abstract int getModifiers(); 039 040 /** 041 * Returns true if this member is static, false if not. 042 */ 043 public boolean isStatic() { 044 return Modifier.isStatic(getModifiers()); 045 } 046 047 /** 048 * Returns true if this member is public, false if not. 049 */ 050 public boolean isPublic() { 051 return Modifier.isPublic(getModifiers()); 052 } 053 054 public abstract String getName(); 055 056 public abstract Class<?> getType(); 057 058 public abstract Class<?> getDeclaringClass(); 059}