package org.testng.internal.reflect; import org.testng.collections.Lists; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.LinkedList; import java.util.List; public class ReflectionHelper { /** * @return An array of all locally declared methods or equivalent thereof * (such as default methods on Java 8 based interfaces that the given class * implements). */ public static Method[] getLocalMethods(Class<?> clazz) { Method[] result; Method[] declaredMethods = clazz.getDeclaredMethods(); List<Method> defaultMethods = getDefaultMethods(clazz); if (defaultMethods != null) { result = new Method[declaredMethods.length + defaultMethods.size()]; System.arraycopy(declaredMethods, 0, result, 0, declaredMethods.length); int index = declaredMethods.length; for (Method defaultMethod : defaultMethods) { result[index] = defaultMethod; index++; } } else { List<Method> prunedMethods = Lists.newArrayList(); for (Method declaredMethod : declaredMethods) { if (!declaredMethod.isBridge()) { prunedMethods.add(declaredMethod); } } result = prunedMethods.toArray(new Method[prunedMethods.size()]); } return result; } private static List<Method> getDefaultMethods(Class<?> clazz) { List<Method> result = null; for (Class<?> ifc : clazz.getInterfaces()) { for (Method ifcMethod : ifc.getMethods()) { if (!Modifier.isAbstract(ifcMethod.getModifiers())) { if (result == null) { result = new LinkedList<>(); } result.add(ifcMethod); } } } return result; } }