1

私はAPIをブラウジングしていて、これをグーグルで検索しようとしましたが、正しく表現できないか、不可能だと思います. 私の質問は、メソッドが呼び出された場所に基づいて、特定のコード シーケンスをメソッドに実行させることは可能ですか?

4

3 に答える 3

4

現在のスタック トレースを取得し、どのメソッドが現在のメソッドを呼び出したかを把握できます。

ただし、これは非常に汚いように見えるため、メソッドにパラメーターを追加したり、別のメソッドを作成したりするだけでなく、ユース ケースが実際にこのアプローチを正当化することを確認する必要があります。

于 2013-03-07T14:29:30.983 に答える
3

継承と2つの異なる実装に適した場所のようです

于 2013-03-07T14:31:09.163 に答える
3

はい、可能です。しかし、それはおそらく悪い考えです。

この種のことを達成する 1 つの方法は次のようになります。

public void myMethod(...) {
    Exception ex = new Exception();
    StackTraceElement caller = ex.getStackTrace()[1];
    if (caller.getMethod().equals("someMethod") {
        // do this 
    } else {
        // do that
    }
}

StackTraceElement は、メソッドの名前、宣言クラスの名前、および利用可能な場合はソース ファイルの名前とソース行番号を示します。

これが悪い考えである理由はいくつかあります。

  • この種のものは壊れやすい傾向があります。メソッドがどこから呼び出されるかを事前に予測することは困難であり、将来別の開発者によって行われる可能性のある変更を予測することは困難です。
  • 特にスタックが深い場合、スタックトレース配列を構築するのはコストがかかります。
  • 「最小の驚き」ルールに違反しています。開発者は、メソッドがそのように動作することを期待していません。
  • おそらくもっと良い方法があります...あなたが達成しようとしていることは何でも。
于 2013-03-07T14:31:53.163 に答える