经常有这样的情况:调用一个方法,出现某种问题。我们肯定会想看看传进来的参数是不是有问题。通常我们会有两种方式:1、直接打印出来。2、跟踪调试。
大家一般是怎么样做呢?反正我是这么做的:
doSome(ArgumentType arg){
System.out.println("doSome()------------arg="+arg);
//或者Log.i(TAG,"doSome()--------------arg="+arg);
}
这样写很费劲啊,我在想,能不能通过反射之类的东东,让我不用写手函数名称,但又知道这个日志是哪个函数打印出来的呢?
还好,让我找到了一个这样的类,那就是:StackTraceElement,这个类能得到堆栈中当前调用方法的一个属性,当前函数的名称,代码行数,等等...
具体说明,凑合着看下翻译内容吧:http://translate.google.com.hk/translate?act=url&hl=zh-CN&ie=UTF8&prev=_t&sl=en&tl=zh-CN&u=http://developer.android.com/reference/java/lang/StackTraceElement.html
利用这个类,写了下面这个工具类。
大家一般是怎么样做呢?反正我是这么做的:
doSome(ArgumentType arg){
System.out.println("doSome()------------arg="+arg);
//或者Log.i(TAG,"doSome()--------------arg="+arg);
}
这样写很费劲啊,我在想,能不能通过反射之类的东东,让我不用写手函数名称,但又知道这个日志是哪个函数打印出来的呢?
还好,让我找到了一个这样的类,那就是:StackTraceElement,这个类能得到堆栈中当前调用方法的一个属性,当前函数的名称,代码行数,等等...
具体说明,凑合着看下翻译内容吧:http://translate.google.com.hk/translate?act=url&hl=zh-CN&ie=UTF8&prev=_t&sl=en&tl=zh-CN&u=http://developer.android.com/reference/java/lang/StackTraceElement.html
利用这个类,写了下面这个工具类。
package com.example.paycenterdemo;
import android.util.Log;
/**
* 参数跟踪日志类
* 当某个函数执行此类的trace(Param...params)方法时,将会打印出此函数的名称、所在的行数、传入的参数值列
*表等详细信息。利用其可以检查参数,容易发现函数调用时传递参数出现的错误。
*
* @author zhougang01
*
*/
public final class LogHelper {
private static boolean mIsDebugMode = true; //获取堆栈信息会影响性能,发布应用时记得关闭DebugMode
private static String mLogTag = "LogHelper";
private static final String CLASS_METHOD_LINE_FORMAT = "%s.%s() Line:%d params=(%s)";
/**
* 打印跟踪日志
* @param params
*/
public static <Param>void trace(Param...params) {
if (mIsDebugMode) {
StackTraceElement traceElement = Thread.currentThread()
.getStackTrace()[3];//从堆栈信息中获取当前被调用的方法信息
StringBuffer strParmas = getParams(params);
String logText = String.format(CLASS_METHOD_LINE_FORMAT,
traceElement.getClassName(), traceElement.getMethodName(),
traceElement.getLineNumber(), strParmas);
Log.e(mLogTag, logText);//打印Log
}
}
/**
* 分解参数列表 返回字符串
* @param params
* @return
*/
private static <Param>StringBuffer getParams(Param... params) {
StringBuffer strParmas = new StringBuffer();
boolean isFirt = true;
if(params!=null){
for(Param param:params){
if(isFirt){
if(param!=null){
strParmas.append("["+param.toString()+"]");
}else{
strParmas.append("[null]");
}
isFirt = false;
}else{
if(param!=null){
strParmas.append(",["+param.toString()+"]");
}else{
strParmas.append(",[null]");
}
}
}
}
return strParmas;
}
}
使用方法:Loger.trace(null,"dosome",null);//这里的参数可以多个,任意类型(但通常和当前函数的参数列表相同)
日志效果:08-14 19:10:32.550: E/LogHelper(17821): com.example.paycenterdemo.MainActivity.dosome() Line:48 params=([null],[dosome],[null])