StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stacktrace[2];//maybe this number needs to be corrected
String methodName = e.getMethodName();
public class Common {
// can be used as test-flag anywhere in the app (set to false, when release the app)
public static boolean b_TEST_MODE = true;
public static void echo(String message) {
if (b_TEST_MODE) {
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
// subtring(25) is to cut off app-name from output
System.out.println(">>> " + stackTraceElements[3].toString().substring(25) + ": " + message);
}
}
}
现在,您可以从应用程序中的任何位置调用它来获取一些信息:
String sSQLQuery = "SELECT * FROM database WHERE id=23";
Common.echo(sSQLQuery);
logcat打印输出:
>>> MainActivity.onCreate(MainActivity.java:46): SELECT * FROM dateabase WHERE id=23
System.out.println("Name of Caller method:"
+ new Throwable().getStackTrace()[1].getMethodName());
System.out.println("Name of Current method:"
+ new Throwable().getStackTrace()[0].getMethodName());
8条答案
按热度按时间wqsoz72f1#
你可以试试
6za6bjd02#
下面是一些更现代(Java 9+中提供)、性能更好的代码。
根据需要将
skip(1)
更改为更大的数字,以便在堆栈中更高。这比
Thread.currentThread().getStackTrace()
执行得更好,因为它不遍历整个堆栈并分配所有堆栈帧,它只遍历堆栈上的两个帧。此方法可以调整为返回
StackWalker.StackFrame
,其中包含有关该方法的大量信息。slsn1g293#
我写了一个函数,记录调用它的函数的函数名。它沿着堆栈跟踪向上运行,直到找到一个名为logIt的函数,然后显示下一个函数名。这是一个肮脏的黑客,所以除非你用它来调试,否则不要这样做。
4dc9hkyq4#
我调整了这里讨论的代码,并定制它来获取调用方法。这里的代码所做的是迭代堆栈跟踪元素,一旦它找到被调用方法的名称,它就获取前一个方法的名称,而前一个方法又将是调用该方法的方法。
lf5gs5x25#
另一个安卓使用示例:
用法:
输出:
阵列示例:
yxyvkwin6#
有时候我想向logcat输出一些东西,所以我写了一个包含一些测试方法的小类:
现在,您可以从应用程序中的任何位置调用它来获取一些信息:
logcat打印输出:
a64a0gku7#
我不知道为什么,但是在我的工作中,开发系统与测试和生产环境不同,在堆栈中移动位置。我被迫在堆栈中循环,以从堆栈跟踪中的下一个元素中找到并获得调用方法。有点笨重,但到目前为止一直返回所需的方法。我使用这作为错误处理的一部分,以确定在哪里捕获了异常。
aor9mmx18#
通过更改索引值检查以下行: