在一个Class中写了一个方法: public static Object Do(Object request) {
String callFuncName = new Throwable().getStackTrace()[1].getMethodName();
System.out.println(callFuncName );
                                return ...;
}这样可以知道调用Do这个方法的函数名字,但是并不稳定样的,不是所有的调用该函数的方法都能打应出对应的名字。如我有20个地方都调用了这个静态方法,但就偶尔会碰到一个调用方法打印不出来,不知道什么原因,是这种方法不够稳定吗?因为我在javadoc上看到这样的描述:某些虚拟机在某些情况下可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,没有该 throwable 堆栈跟踪信息的虚拟机可以从该方法返回一个零长度数组。一般说来,由此方法返回的数组将包含由 printStackTrace 输出的每帧的一个元素。 不知道有没有朋友碰到过呢,或者有别的替代方法吗?

解决方案 »

  1.   

    怎么会没人看的懂???public class Test {
    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会是栈数组中第一个元素的。所以很奇怪。有别的替代方法吗?除了传递一个参数为“函数名”的字符串
      

  2.   

    第一个元素.....那下标就是0了啊..不是1
    public static void function() {
         StackTraceElement e[]=new Throwable().getStackTrace();
            System.out.println(e[0].getMethodName());
        }
      

  3.   

    楼上的大哥,你还没懂吗?我要的是调用function的函数的名字,就是caller的名字。而不是本函数的名字。所以我用下标1的。但为什么有时会打印出function出来呢,我就奇怪了。所以既然这个不靠谱就想问问有没有别的替代的方法。
      

  4.   

    本帖最后由 AWUSOFT 于 2010-05-18 10:19:21 编辑
      

  5.   

    情况比较复杂,我是在WAS上的webservices上的一些实现上用到了这个方法来判断请求过来的是什么webservices服务名,但有一个总是不灵光,所以打算不用这样的方法来判断了,但我又不想在每个webservices服务的实现里手工加上一个字符串参数传递过来。所以请教一下有没有别的办法呢?
      

  6.   

    是同一个caller调用1000次,会出现1次stackTrace异常,还是指,平均1000个不同的caller,有一个显示不出?
      

  7.   

    是后者,比如我有二十个caller,结果每次都是第18个caller调用的时候得到的函数名不是caller而是function.我也很奇怪。当然这些都是部署在was里的,但把was重启一下又好了。下次又不行了。具体的规律还没掌握清楚,看来是和环境有关系。现在想找个替代的简便的方法。
      

  8.   

    用当前线程的StackTraceElement[]    StackTraceElement[] stackTraceElements = 
          Thread.currentThread().getStackTrace();试试。
      

  9.   


    你确定每次出错都是同一个caller?
      

  10.   

    是的。得把WAS重启一下又可以调用了。不知何故啊
      

  11.   

    第一次出错后不重启的话,继续执行,仍然有时是function有时是caller吗
      

  12.   

    不重启的话如果继续执行该操作则一直显示一样的错误,还是显示function.其它的操作都是正常的,就这一个调用该函数的接口不行。只有重启后才能好。
      

  13.   

    这个就很奇怪了,这时如果是function的话 那首元素会是什么呢public static void function() {
        System.out.println(new Throwable().getStackTrace()[1].getMethodName());    if((new Throwable().getStackTrace()[1].getMethodName()).equals("function")) {
            System.out.println(new Throwable().getStackTrace()[0].getMethodName());
        }
    }看看此时首元素会是什么
      

  14.   

    也觉得奇怪,你eclipse下查一下reference,看看会不会有其他地方调用啊。