在一个Class中写了一个方法: public static Object Do(Object request) {
String callFuncName = new Throwable().getStackTrace()[1].getMethodName();
System.out.println(callFuncName );
return ...;
}这样可以知道调用Do这个方法的函数名字,但是并不稳定样的,不是所有的调用该函数的方法都能打应出对应的名字。如我有20个地方都调用了这个静态方法,但就偶尔会碰到一个调用方法打印不出来,不知道什么原因,是这种方法不够稳定吗?因为我在javadoc上看到这样的描述:某些虚拟机在某些情况下可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,没有该 throwable 堆栈跟踪信息的虚拟机可以从该方法返回一个零长度数组。一般说来,由此方法返回的数组将包含由 printStackTrace 输出的每帧的一个元素。 不知道有没有朋友碰到过呢,或者有别的替代方法吗?
String callFuncName = new Throwable().getStackTrace()[1].getMethodName();
System.out.println(callFuncName );
return ...;
}这样可以知道调用Do这个方法的函数名字,但是并不稳定样的,不是所有的调用该函数的方法都能打应出对应的名字。如我有20个地方都调用了这个静态方法,但就偶尔会碰到一个调用方法打印不出来,不知道什么原因,是这种方法不够稳定吗?因为我在javadoc上看到这样的描述:某些虚拟机在某些情况下可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,没有该 throwable 堆栈跟踪信息的虚拟机可以从该方法返回一个零长度数组。一般说来,由此方法返回的数组将包含由 printStackTrace 输出的每帧的一个元素。 不知道有没有朋友碰到过呢,或者有别的替代方法吗?
public static void caller() {
function();
} public static void function() {
System.out.println(new Throwable().getStackTrace()[1].getMethodName());
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test.caller();
}}输出caller,因为我要知道调用function的函数的名字。但我发现如果我有很多地方调用function的话,并不是每次都能打印出这个调用该function的函数名字,总是有一次会显示出function自己的名字,按道理function会是栈数组中第一个元素的。所以很奇怪。有别的替代方法吗?除了传递一个参数为“函数名”的字符串
public static void function() {
StackTraceElement e[]=new Throwable().getStackTrace();
System.out.println(e[0].getMethodName());
}
Thread.currentThread().getStackTrace();试试。
你确定每次出错都是同一个caller?
System.out.println(new Throwable().getStackTrace()[1].getMethodName()); if((new Throwable().getStackTrace()[1].getMethodName()).equals("function")) {
System.out.println(new Throwable().getStackTrace()[0].getMethodName());
}
}看看此时首元素会是什么