2011-07-31 34 views
8

我使用這種模式:有什麼辦法可以在Android中自動記錄方法名稱?

public class FooProvider extends ContentProvider { 
    private static final String TAG = FooProvider.class.getSimpleName(); 
    ... 

    @Override 
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { 
     l.v(TAG, TAG + ".update() Uri:" + uri.toString() + " " + db.getPath()); 

其中L是我的包裝輪機器人會Log.v這需要字符串參數... args。這讓logcat的輸出是這樣的:

FooProvider.update() Uri: foo bar etc 

我正在尋找的是一個登錄方法名的方式,在這種情況下更新(),自動在能經受住TAG重構的方式做的方式。我已經看到了class.getMethods()調用,但看不到在運行時用當前方法爲返回列表建立索引的方法。

+0

你應該試試這個簡單的lib:https://github.com/MustafaFerhan/DebugLog – gturedi

回答

13

您可能希望在恆定包這些語句,使他們獲得編出來爲你發佈的版本(這將不被打印反正陳述Log.v),但你可以做這樣的事情:

private static final boolean FINAL_CONSTANT_IS_LOCAL = true; 
private static final String TAG = FooProvider.class.getSimpleName(); 

private String getLogTagWithMethod() { 
    if (FINAL_CONSTANT_IS_LOCAL) { 
     Throwable stack = new Throwable().fillInStackTrace(); 
     StackTraceElement[] trace = stack.getStackTrace(); 
     return trace[0].getClassName() + "." + trace[0].getMethodName() + ":" + trace[0].getLineNumber(); 
    } else { 
     return TAG; 
    } 
} 

這取決於你如何調用它來確定你需要哪個StackTraceElement索引,只需要調試它或者幾次播放就可以找到它。

當您編譯已發佈的版本時,只需將FINAL_CONSTANT_IS_LOCAL設置爲false,該代碼塊將消失,並始終返回TAG。

+0

這很巧妙。 Idistic的也很聰明 - 我希望我可以獎你們兩個。 –

9

似乎昂貴,但你可以使用

String Method = Thread.currentThread().getStackTrace()[2].getMethodName(); 

您使用的2的指數的原因,就是0 =將返回currentThread和1 =的getStackTrace。這適用於Java 1.5及以上版本,我會將它封裝在某種if(DEBUG){}的東西中,所以它不在生產代碼中

當然,如果將其放入方法等內容中,您將需要調整深度。

0

你可以把靜態的方法,如這些和方法的開頭和結尾要調試打電話給他們:

public static void entry_log(String id) { 
       Throwable stack = new Throwable().fillInStackTrace(); 
       StackTraceElement[] trace = stack.getStackTrace(); 

        Log.v("ENTRY", 
          id + " - " + trace[1].getClassName() + "." 
            + trace[1].getMethodName() + ":" 
            + trace[1].getLineNumber()); 
        break; 

      } 

而且

public void exit_log(String id) { 
      Throwable stack = new Throwable().fillInStackTrace(); 
      StackTraceElement[] trace = stack.getStackTrace(); 

       Log.v("EXIT", 
         id + " - " + trace[1].getClassName() + "." 
           + trace[1].getMethodName() + ":" 
           + trace[1].getLineNumber()); 
       break; 

     } 

我創建this Logging utility除了入口出口日誌以外,還提供更多功能。你可能會覺得它很有用。

相關問題