如何查看调用本方法的函数名

Andy84920 2010-05-17 07:54:52
在一个Class中写了一个方法:

public static Object Do(Object request) {
String callFuncName = new Throwable().getStackTrace()[1].getMethodName();
System.out.println(callFuncName );
return ...;
}

这样可以知道调用Do这个方法的函数名字,但是并不稳定样的,不是所有的调用该函数的方法都能打应出对应的名字。如我有20个地方都调用了这个静态方法,但就偶尔会碰到一个调用方法打印不出来,不知道什么原因,是这种方法不够稳定吗?

因为我在javadoc上看到这样的描述:

某些虚拟机在某些情况下可能会从堆栈跟踪中省略一个或多个堆栈帧。在极端情况下,没有该 throwable 堆栈跟踪信息的虚拟机可以从该方法返回一个零长度数组。一般说来,由此方法返回的数组将包含由 printStackTrace 输出的每帧的一个元素。

不知道有没有朋友碰到过呢,或者有别的替代方法吗?
...全文
390 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
shine333 2010-05-24
  • 打赏
  • 举报
回复
也觉得奇怪,你eclipse下查一下reference,看看会不会有其他地方调用啊。
dracularking 2010-05-24
  • 打赏
  • 举报
回复
这个就很奇怪了,这时如果是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());
}
}

看看此时首元素会是什么
Andy84920 2010-05-24
  • 打赏
  • 举报
回复
不重启的话如果继续执行该操作则一直显示一样的错误,还是显示function.其它的操作都是正常的,就这一个调用该函数的接口不行。

只有重启后才能好。
dracularking 2010-05-21
  • 打赏
  • 举报
回复
第一次出错后不重启的话,继续执行,仍然有时是function有时是caller吗
Andy84920 2010-05-20
  • 打赏
  • 举报
回复
是的。得把WAS重启一下又可以调用了。不知何故啊。。。
shine333 2010-05-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 andy84920 的回复:]

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

你确定每次出错都是同一个caller?
dracularking 2010-05-18
  • 打赏
  • 举报
回复
不是很清楚环境,请求有没有集合任何可直接或间接获得的目标信息?既然楼主可以截获请求,是在什么样的上下文中呢,响应是一个总入口吗,抱歉所知有限...
Andy84920 2010-05-18
  • 打赏
  • 举报
回复
情况比较复杂,我是在WAS上的webservices上的一些实现上用到了这个方法来判断请求过来的是什么webservices服务名,但有一个总是不灵光,所以打算不用这样的方法来判断了,但我又不想在每个webservices服务的实现里手工加上一个字符串参数传递过来。所以请教一下有没有别的办法呢?
dracularking 2010-05-18
  • 打赏
  • 举报
回复
好像挺稳定的,调用1000遍,10000遍也没有出现什么异常
楼主是哪种情况会出现呢
awusoft 2010-05-18
  • 打赏
  • 举报
回复
终于明白了......出现的机率很小吧?考虑一下是不是其它的问题...
Andy84920 2010-05-18
  • 打赏
  • 举报
回复
楼上的大哥,你还没懂吗?我要的是调用function的函数的名字,就是caller的名字。而不是本函数的名字。所以我用下标1的。但为什么有时会打印出function出来呢,我就奇怪了。所以既然这个不靠谱就想问问有没有别的替代的方法。
awusoft 2010-05-18
  • 打赏
  • 举报
回复
第一个元素.....那下标就是0了啊..不是1


public static void function() {
StackTraceElement e[]=new Throwable().getStackTrace();
System.out.println(e[0].getMethodName());
}
Andy84920 2010-05-18
  • 打赏
  • 举报
回复
怎么会没人看的懂???
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会是栈数组中第一个元素的。所以很奇怪。有别的替代方法吗?除了传递一个参数为“函数名”的字符串。。。

ofacop 2010-05-18
  • 打赏
  • 举报
回复
顶楼上的,期待楼下的,关注
kaynezhang 2010-05-18
  • 打赏
  • 举报
回复
用当前线程的StackTraceElement[]

StackTraceElement[] stackTraceElements =
Thread.currentThread().getStackTrace();

试试。
Andy84920 2010-05-18
  • 打赏
  • 举报
回复
是后者,比如我有二十个caller,结果每次都是第18个caller调用的时候得到的函数名不是caller而是function.我也很奇怪。当然这些都是部署在was里的,但把was重启一下又好了。下次又不行了。具体的规律还没掌握清楚,看来是和环境有关系。现在想找个替代的简便的方法。
shine333 2010-05-18
  • 打赏
  • 举报
回复
是同一个caller调用1000次,会出现1次stackTrace异常,还是指,平均1000个不同的caller,有一个显示不出?
Andy84920 2010-05-18
  • 打赏
  • 举报
回复
没有别的方法吗?
zqfddqr 2010-05-17
  • 打赏
  • 举报
回复
斑竹快来呵呵
zqfddqr 2010-05-17
  • 打赏
  • 举报
回复
哎 我是新手还以为中病毒了 吓我一跳

3楼还引用了一下无语
加载更多回复(6)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧