5
#include <stdio.h>
void someFunc(void) {
  printf("%s\n"), __func__);
}

関数が呼び出されるたびに、次のように表示されます。

someFunc

Javaに相当するものは何ですか?

見つけた

(new Exception()).getStackTrace()[0].getMethodName()

java.lang.Thread.currentThread().getStackTrace()[1].getMethodName()

しかし、これらはばかげているように思えます。もっと簡単な方法はありますか?

4

5 に答える 5

6

いいえ、簡単な方法はありません。Javaにはマクロ機能がないため、C++バージョンに直接相当するものはありません。

于 2011-03-26T00:13:03.027 に答える
2

ちょっとした設定で、 log4jのようなものをメソッド名 (および必要なその他の詳細) を含むパターンでセットアップできます。

private static final Logger log = Logger.getLogger(MyClass.class);

void someMethod() {
    log.info("text");
}

ここでの利点は、セットアップを 1 回行えば、必要な数の場所でロガーを再利用できることです。

于 2011-03-26T00:23:07.787 に答える
2

必要に応じて、log4j を使用し、%M パターンを使用してメソッド名を出力できます -> http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

ただし、ドキュメントには次の警告があります。

警告 発信者の位置情報の生成は非常に遅いため、実行速度が問題にならない場合を除き、避ける必要があります。

彼らはおそらくあなたの に似たトリックを使用します(new Exception()).getStackTrace()[0].getMethodName()が、これはすべてのログステートメントで使用する非常に遅い呼び出しです.

一方、log4j は高度にカスタマイズ可能であり、パフォーマンスが重要ではないコードのサブセットにメソッド名の出力を追加できます。

于 2011-03-26T00:27:04.117 に答える
2

答えはノーだ。

ちなみに、あなたが見つけた 2 つのアプローチは本質的に同等です。tが現在のスレッドの場合t.getStackTrace()、 のインスタンスを作成しExceptionて呼び出すgetStaceTrace()ことで機能します。

他の人が指摘しているように、スタックトレースをキャプチャするための を作成するExceptionことは、Java では高価な操作であるため、注意して行う必要があります。

于 2011-03-26T00:31:40.540 に答える