package net.thucydides.core.reflection; import java.lang.reflect.Method; public class StackTraceAnalyser { private final StackTraceElement stackTraceElement; private StackTraceAnalyser(StackTraceElement stackTraceElement) { this.stackTraceElement = stackTraceElement; } public static StackTraceAnalyser forStackTraceElement(StackTraceElement stackTraceElement) { return new StackTraceAnalyser(stackTraceElement); } public Method getMethod() { try { if (allowedClassName(stackTraceElement.getClassName())) { Class callingClass = Class.forName(stackTraceElement.getClassName()); Method matchingMethod = extractMethod(stackTraceElement, callingClass); if (matchingMethod != null) { return matchingMethod; } } } catch (ClassNotFoundException classNotFound) {} return null; } public static Method extractMethod(StackTraceElement stackTraceElement, Class callingClass) { Class targetClass; if (isInstrumentedMethod(stackTraceElement)) { targetClass = callingClass.getSuperclass(); } else { targetClass = callingClass; } try { return targetClass.getMethod(stackTraceElement.getMethodName()); } catch (NoSuchMethodException e) { return null; } } private static boolean isInstrumentedMethod(StackTraceElement stackTraceElement) { return (stackTraceElement.getFileName()) != null && (stackTraceElement.getFileName().equals("<generated>")); } private boolean allowedClassName(String className) { return !((className.startsWith("sun.")) || (className.startsWith("java."))); } }