即实现下图的效果
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Test",LogUtils.getTopStackInfo());
}
}

关键代码:
public class LogUtils {
/**
* 获取当前栈信息
*/
protected static StackTraceElement getCurrentStackTrace() {
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
int stackOffset = getStackOffset(trace);
if (stackOffset == -1){
return null;
}
StackTraceElement caller = trace[stackOffset];
return caller;
}
protected static int getStackOffset(StackTraceElement[] trace) {
String preClassName = "";
for (int i = 0; i < trace.length; i++) {
StackTraceElement e = trace[i];
String name = e.getClassName();
try {
if (!"".equals(preClassName)){
Class<?> preClass = Class.forName(preClassName);
Class<?> nowClass = Class.forName(name);
if ((preClass == LogUtils.class ||
preClass.getSuperclass() == LogUtils.class) &&
(nowClass != LogUtils.class &&
nowClass.getSuperclass() != LogUtils.class)){
return i;
}
}
preClassName = name;
} catch (ClassNotFoundException exc) {
exc.printStackTrace();
}
}
return -1;
}
protected static String getTopStackInfo() {
StackTraceElement caller = getCurrentStackTrace();
if (caller == null){
return null;
}
String stackTrace = caller.toString();
stackTrace = stackTrace.substring(stackTrace.lastIndexOf('('), stackTrace.length());
String tag = "%s.%s%s";
String callerClazzName = caller.getClassName();
callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1);
tag = String.format(tag, callerClazzName, caller.getMethodName(), stackTrace);
return tag;
}
}
本文介绍了一种在Java应用程序中使用LogUtils类获取调用堆栈信息的方法。通过分析Thread.currentThread().getStackTrace()获取的堆栈元素,LogUtils能准确地定位到调用日志记录方法的代码位置,包括类名、方法名及行号,这对于调试和错误报告非常有用。
1万+

被折叠的 条评论
为什么被折叠?



