2017-05-18 15 views
2

私はアンドロイドの開発者であり、ロギングは大変です。私が持っていたJava/Androidの任意の場所でクラス名とメソッド名を取得

の形をしている私のログの規則を使用して、[クラス名:methodNameの()]

私は何かをログに記録する必要がありたびに、これは、特定の場所から正確な場所を見つける私を助けてログが生成され、多くの場合役立ちます。

代わりのたびに書い

のClassName

メソッド名

手動で私は方法を書きました。彼らはこれを行うより良いアプローチかもしれません。ループを使用しない場合の回答はです。です。

public static String getRef(Object object) { 
     StackTraceElement[] elements = Thread.currentThread().getStackTrace(); 
     String method = ""; 
     if (elements.length > 0) { 
      for (int i = 0; i < elements.length; i++) { 
       if (elements[i].getClassName().equals(object.getClass().getCanonicalName())) { 
        method = elements[i].getMethodName(); 
        break; 
       } 
      } 
     } 
     return "[" + object.getClass().getSimpleName() + "::" + method + "()]"; 
    } 

呼び出し:

Log.d(STRING_TAG、GlobalConfig.getRef(本)+ "サーバー 応答:" + JSON)。

iが既にgetEnclosingMethod())

Object.getClassを(使用しようとしました。

しかし、常に私はnullを返すだけでなく、それは右と呼ばれるメソッド名を返すことになっていますか?このClassオブジェクトが メソッド内のローカルクラスまたは匿名クラスを表す場合のドキュメントは

を言うように、基本となるクラスを直接囲む メソッドを表すMethodオブジェクトを返します。そうでない場合はnullを返します。特に このメソッドは、基になるクラスがローカルまたは の匿名クラスで、型宣言ですぐに囲まれている場合、つまりインスタンス イニシャライザまたは静的イニシャライザの場合はnullを返します。
返信
このクラスがローカルクラスまたは匿名クラスの場合は、基になる クラスのすぐに囲むメソッド。それ以外の場合はnull

+2

使用* SLF4J *と*のlog4j *が好きなようにあなたは単に、再発明する必要がoutpusを設定することはできませんホイール... –

+0

@TimothyTruckleあなたのフィードバックのためにありがとう、実際にアンドロイドは、独自のロギングライブラリを持っています、私が欲しいのは、アプリケーションの任意の時点でメソッド名を取得することです。 –

+0

*「アンドロイドは独自のログライブラリを持っています」* - 間違っています:https://www.slf4j.org/android/ –

答えて

1

あなたはそれを直接呼び出すために行く場合は、私が説明:

  1. あなたはクラスAであり、そしてあなたはあなたがクラスから直接
  2. を、このメソッドを呼び出しますここ
  3. であることをログに記録したいです

    StackTraceElement[] elements = Thread.currentThread().getStackTrace(); 
    String method = ""; 
    method = elements[elements.length - 2].getMethodName(); 
    return "[" + object.getClass().getSimpleName() + "::" + method + "()]"; 
    

    Whを:あなたはこれを使用することができます

あなたは最後のクラスを呼び出すでしょうか?例:アウト

public class Random { 

public static void main(String[] args) { 
    Random r = new Random(); 
    r.test(); 
} 

public void test() { 
    System.out.println(Logger.getRef(this)); 
} 

} 

class Logger { 

public static String getRef(Object object) { 
    StackTraceElement[] elements = Thread.currentThread().getStackTrace(); 
    String method = ""; 
    method = elements[2].getMethodName(); 
    return "[" + object.getClass().getSimpleName() + "::" + method + "()]"; 
} 

} 

:[ランダム::テスト()]

+0

インデックスは静的な要素[elements.length - 2] –

+0

を見つけることができません申し訳ありませんが、どうしてですか?つまり、呼び出し元が必要な場合は、配列内の最後の1つになります。 'Log.d(STRING_TAG、GlobalConfig.getRef(this)+"サーバーの応答: "+ json);'を呼び出すときでも。これは、すべてのインデックスをループせずに、クラス名 – BrunoDM

+0

でチェックするだけで、必要な情報を得る唯一の方法です。コードが正しい場合は、StackTraceに他の要素がある場合はどうすればいいですか? –

関連する問題