缘由
开发输出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获取方法名。