参数跟踪---快速调试

61 篇文章 0 订阅
经常有这样的情况:调用一个方法,出现某种问题。我们肯定会想看看传进来的参数是不是有问题。通常我们会有两种方式: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 
利用这个类,写了下面这个工具类。

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])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值