2011-07-31 9 views
8

は、私はこの種のパターンを使用しています。lがString ...引数を取るアンドロイドLog.vラウンド私のラッパーである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()); 

FooProvider.update() Uri: foo bar etc 

私は何を探していますが、この場合の更新()、自動的にタグがない方法をリファクタリング生き残る方法でで、メソッド名をログに記録する方法です。これは、このようlogcat出力を提供します。私はclass.getMethods()呼び出しを見たことがありますが、実行時に現在のメソッドで返されたリストのインデックスを作成する方法を見ることができません。

+0

この簡単なライブラリを試してみてください。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を作成エントリー終了ログ以外のいくつかの機能を備えたAndroid用それが役に立つかもしれません。

関連する問題