2

私はEclipseを使用しており、コンパイルする前にプリプロセッサが現在のメソッドの名前に置き換える「マクロ」が必要です。

次のように呼ばれるエラー報告関数があります。reportthis(String errormessage)- アプリケーション全体のさまざまな関数には、エラー時に catch ブロックから reportthis(...) を呼び出す try/catch ブロックがあります。

次のようなものを指定できるようにしたいと思いますreportthis(MACRO_CURRENT_METHOD_NAME + ":" + e.ToString());-MACRO_CURRENT_METHOD_NAMEコンパイル前にEclipseによって前処理され、catch {}ブロックがreportthis()を呼び出すメソッドの名前になります。

したがって、main() で catch{} ブロックが発生した場合、マクロは文字列「main」(または「main()」など) を返す必要があります。

これは可能ですか?目標を達成するにはどうすればよいですか?

ありがとうございました!

編集 Eclipse のプリプロセッサでこれを実行したいのですが、それらは不可能ですか? 「MACRO_CURRENT_METHOD_NAME」のすべての出現を現在の関数名に置き換えるEclipse用のプラグインを作成することはおそらく可能ではないでしょうか?

4

3 に答える 3

2

これを行う自動化された方法が見つからなかったため、ロギング コードの呼び出しごとに呼び出し元の名前を示す文字列リテラルを手動で追加しました。

Nokia の S40 プラットフォームも Java-ME に基づいており、一部の Nokia S40 開発者は、Sourceforge で入手できる Jarrut をうまく利用して、スタックを追跡するようにプログラムを変更してスタック トレースを生成していることを知っています。この機能を利用して、ロギング コードで呼び出し元の関数名を取得できますが、それを機能させるには Jarrut を少し変更する必要がある場合があります。

于 2013-05-26T04:05:28.627 に答える
1

Java はマクロをサポートしていません。しかし、現在のメソッドを決定するためにできることは次のようなものです

  final StackTraceElement aTop = Thread.currentThread ().getStackTrace ()[1];
  System.out.println (aTop.getMethodName ());

[0] の要素は Thread.getStackTrace() であるため、インデックス [1] の要素を使用すると、呼び出し元のメソッドを取得できます。このコードを別のメソッドでラップする場合、使用しているラッピング メソッドの数に応じて、配列インデックスを 2 などに設定する必要があります。

于 2013-05-24T18:53:05.110 に答える
0

Java にはプリプロセッサはなく、マクロ言語もありません。

いずれかが役立つ状況もありますが、例外のスタック トレースには、例外が発生した場所のクラスとメソッドが既に含まれているため、問題が完全に無意味であることを理解していれば問題ありません。

"reportthis()" に文字列を渡す代わりに、例外を取得して出力するだけの署名を作成します (または単に e.printStackTrace() を記述します)。

于 2013-05-24T18:52:46.093 に答える