gpt4 book ai didi

java - 为 getStackTrace()[2].getMethodName() 获得不同的结果

转载 作者:IT老高 更新时间:2023-10-28 21:02:10 27 4
gpt4 key购买 nike

出于日志记录的目的,我创建了一个方法 logTitle(),它打印出 TestNG 测试的调用方法名称。示例代码如下。

@Test
public void test1() throws Exception {
method1();
}

public static void method1() throws Exception {
Utils.logTitle(2);
}

...

public static void logTitle(Integer level) throws Exception {

// Gets calling method name
String method = Thread.currentThread().getStackTrace()[2].getMethodName();
// This would get current method name
switch (level) {
case 1:
logger.info("=======================================================");
logger.info(method);
logger.info("=======================================================");
break;
case 2:
logger.info("------------------------------------");
logger.info(method);
logger.info("------------------------------------");
break;
case 3:
logger.info("---------------------");
logger.info(method);
logger.info("---------------------");
break;
case 4:
logger.info("--------- " + method + " ------------");
break;
default:
logger.info(method);
}
}

问题是我在两台不同的机器上得到不同的 logTitle() 结果。

每个人的笔记本电脑都正确返回:

2016-06-20 14:22:06 INFO  - ------------------------------------
2016-06-20 14:22:06 INFO - method1
2016-06-20 14:22:06 INFO - ------------------------------------

我们的开发 unix 框返回不同:

2016-06-20 14:42:26 INFO  - ------------------------------------
2016-06-20 14:42:26 INFO - logTitle
2016-06-20 14:42:26 INFO - ------------------------------------

这在其他所有人的笔记本电脑上都能正常工作,但在开发 unix 机器上却不行。我认为 dev unix 机器使用的是 IBM 的 Java 版本,而其他人都在使用 Oracle 的 Java 版本,但不确定这是否是罪魁祸首。

有什么想法吗?

最佳答案

来自 Javadoc :

Some virtual machines may, under some circumstances, omit one or more stack frames from the stack trace. In the extreme case, a virtual machine that has no stack trace information concerning this throwable is permitted to return a zero-length array from this method.

因此,唯一有保证的方法是使用方面,或使用其他一些自定义方式收集堆栈跟踪。但是您可以将此方法与回退结合起来,以某种方式获取当前方法的名称(以防您的 logTitle 方法将被内联)。可以找到here , 例如。同样,不能保证,但有更好的机会。

关于java - 为 getStackTrace()[2].getMethodName() 获得不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37932635/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com