0

呼び出しメソッドのパラメータ値を取得するには?

クラス A とクラス B の 2 つのクラス (クラス A 内) と mthB (クラス B 内) の 2 つのメソッドを含むシナリオがあります。mthA が mthB を呼び出します。ここで、すべてのパラメーターが mthA に渡されたことを mthB で知りたいと思います。これは基本的に、例外のロギングと処理のためのものです。呼び出し元のクラス、つまりクラス A のクラス名と、mthB、つまり mthA を呼び出しているメソッド名を取得できます。しかし、私はmthAのパラメータを取得することに行き詰まっています。

Thread.currentThread().getStackTrace()[1].getClassName()

これにより、呼び出しメソッドのクラス名、つまりクラス A が得られます。

Thread.currentThread().getStackTrace()[2].getMethodName()

これにより、呼び出しメソッドのメソッド名、つまり mthA が得られます。

どうにかしてメソッド全体を取得できれば、getParameters() を使用して、このメソッドに渡されるメソッド パラメータを取得できます。

4

4 に答える 4

0

最も簡単な方法がありますか、またはリフレクションを使用する必要がありますか..?

渡されるパラメーターを知りたい場合はmthA 、同じパラメーターをmthB例にも 渡します。

mthA(1stParam, 2ndParam, ...){
     mthB(1stParam, 2ndParam, ..., OtherParamertsForMthB);          
     ...
}
于 2013-05-13T04:29:25.203 に答える
0

呼び出し元メソッドの引数値を取得する簡単な方法はありません (呼び出し先メソッドのパラメーターを変更して、呼び出し元パラメーター値を含めて渡すことができない場合)。

Thread が提供するようないくつかの API を使用すると、クラス/メソッド名などの静的情報を取得できますが、引数値などのランタイム情報は取得できません。1 つの方法は、そのような情報をどこかに保存して管理し、ロギング/例外の場合に必要なときに表示することです。JavaにそのためのAPIがあるとは思わない。

于 2013-05-13T04:31:14.983 に答える
0

ロギングのみを目的としている場合はmthA、メソッドに渡されたすべての引数をログに記録する必要があります。

例外を処理するために の引数値mthBについて知っておく必要があるのはなぜですか? mthAそれを行っている場合は、コードのリファクタリングを検討し、適切なレベルで例外を処理する必要があります。に渡された値がmthA例外につながる場合は、 を呼び出す前にそこで処理する必要がありますmthB

リフレクションは、クラスとメソッドの静的情報を取得するのに役立つだけで、メソッドに渡される引数の実行時の値は提供しません。

于 2013-05-13T04:36:32.510 に答える
0

AspectJ のような AOP ツールを使用して、これらの値をキャプチャしてログに記録してみませんか? after() アドバイスと一緒に execution() ポイント カットを使用できます。非実稼働デプロイメントでは、渡された値と戻り値とともにすべてのメソッド呼び出しをログに記録できます。これは本番環境のオーバーヘッドが大きすぎます。そのためには、渡された値 (AspectJ アドバイスで取得したオブジェクト args[]) をローカル変数に保存し、例外が発生した場合にのみログに記録することができます。ただし、その場合でも、プリミティブ値がボックス化されて Object[] としてアドバイスに渡されるため、パフォーマンスが低下します。

于 2013-08-16T14:56:26.233 に答える