andriod 获取当前函数名

时间:2022-10-01 18:35:03

缘由
开发输出Log时经常会打印当前函数,于是就在网上查找相应的方法, 自己也总结了下:

直接上代码:

public class Utils {
private static final int STACK_TRACE_INDEX = 3;
private static final String SUFFIX = ".java";
public static String getHeadSuffix() {
try{
//获取调用的函数堆栈信息
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement targetElement = stackTrace[STACK_TRACE_INDEX];

//获取类名
String className = targetElement.getClassName();
String[] classNameInfo = className.split("\\.");
if (classNameInfo.length > 0) {
className = classNameInfo[classNameInfo.length - 1] + SUFFIX;
}

//获取内部类
if (className.contains("$")) {
className = className.split("\\$")[0] + SUFFIX;
}
//获取当前方法名
String methodName = targetElement.getMethodName();

//获取当前行号
int lineNumber = targetElement.getLineNumber();

if (lineNumber < 0) {
lineNumber = 0;
}

//输出信息
StringBuffer sb = new StringBuffer();
sb.append(methodName.substring(0, 1).toUpperCase());
sb.append(methodName.substring(1));
String methodNameShort = sb.toString();

StringBuffer sb1 = new StringBuffer();
sb1.append("[ (");
sb1.append(className);
sb1.append(":");
sb1.append(lineNumber);
sb1.append(")#");
sb1.append(methodNameShort);
sb1.append(" ] ");
return sb1.toString();
}catch (Exception e){
return "[]";
}
}
}

详细介绍:

Thread.currentThread().getStackTrace()返回的是一个StackTraceElement数组,内容为调用函数堆栈,并且以调用层级关系保存。

STACK_TRACE_INDEX = 3是因为Android是下标为3获取方法名, 纯Java是下标为2获取方法名。