Thread.currentThread().getStackTrace()
будет обычно содержать метод you’re вызов его от, но существуют ловушки (см. Javadoc):
Некоторые виртуальные машины, при некоторых обстоятельствах, могут опустить один или несколько стековых фреймов от отслеживания стека. В крайнем случае виртуальной машине, которая не имеет никакой информации трассировки стека относительно этого потока, разрешают возвратить массив нулевой длины из этого метода.
Январь 2009:
А полный код был бы (для использования с протест @Bombe в памяти):
/**
* Get the method name for a depth in call stack. <br />
* Utility function
* @param depth depth in the call stack (0 means current method, 1 means call method, ...)
* @return method name
*/
public static String getMethodName(final int depth)
{
final StackTraceElement[] ste = Thread.currentThread().getStackTrace();
//System. out.println(ste[ste.length-depth].getClassName()+"#"+ste[ste.length-depth].getMethodName());
// return ste[ste.length - depth].getMethodName(); //Wrong, fails for depth = 0
return ste[ste.length - 1 - depth].getMethodName(); //Thank you Tom Tresansky
}
[еще 1119] в этот вопрос .
декабрь 2011 Обновления:
синеватый комментарии:
я использую JRE 6, и дает мне неправильное имя метода.
Это работает, если я пишуste[2 + depth].getMethodName().
0
,getStackTrace()
,1
getMethodName(int depth)
, и2
вызывает метод.
ответ virgo47 (upvoted) на самом деле вычисляет правильный индекс для применения для возвращения имени метода.
Я переписанный немного ответ maklemenz :
private static Method m;
static {
try {
m = Throwable.class.getDeclaredMethod(
"getStackTraceElement",
int.class
);
}
catch (final NoSuchMethodException e) {
throw new NoSuchMethodUncheckedException(e);
}
catch (final SecurityException e) {
throw new SecurityUncheckedException(e);
}
}
public static String getMethodName(int depth) {
StackTraceElement element;
final boolean accessible = m.isAccessible();
m.setAccessible(true);
try {
element = (StackTraceElement) m.invoke(new Throwable(), 1 + depth);
}
catch (final IllegalAccessException e) {
throw new IllegalAccessUncheckedException(e);
}
catch (final InvocationTargetException e) {
throw new InvocationTargetUncheckedException(e);
}
finally {
m.setAccessible(accessible);
}
return element.getMethodName();
}
public static String getMethodName() {
return getMethodName(1);
}