001 package org.junit.runners.model;
002
003 import java.lang.reflect.Modifier;
004 import java.util.List;
005
006 /**
007 * Parent class for {@link FrameworkField} and {@link FrameworkMethod}
008 *
009 * @since 4.7
010 */
011 public 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 }