クラスAがさまざまなクラスによって呼び出されることがわかっている場合、その呼び出し元から情報を取得することは可能ですか?あるクラスがそのメソッドを呼び出す外部クラスから情報を取得することは可能ですか?
外部クラスがクラスAのメソッドを呼び出す前に、いくつかのプリ/ポストオペレーションを実行しようとしています。
クラスAがさまざまなクラスによって呼び出されることがわかっている場合、その呼び出し元から情報を取得することは可能ですか?あるクラスがそのメソッドを呼び出す外部クラスから情報を取得することは可能ですか?
外部クラスがクラスAのメソッドを呼び出す前に、いくつかのプリ/ポストオペレーションを実行しようとしています。
最も簡単なのは、呼び出し側または少なくともいくつかのヒントをコンストラクタまたはメソッドの引数として渡すことです。
Other other = new Other(this);
// or
other.doSomething(this);
厄介なのは、スタックトレースに基づいて解読することです。
public void doSomething() {
StackTraceElement caller = Thread.currentThread().getStackTrace()[2];
String callerClassName = caller.getClassName();
// ...
}
コンストラクタに加えて、静的初期化ブロックまたは初期化ブロックを使用できます。
私はあなたの質問に誤解していると思いますが、私は上記で書いたものを残します。
ご要望に応じて、AspectJもご覧ください。あなたの目標を達成するためのきれいな方法を提供するかもしれません。
一般に、クラスがそれを呼び出す人物の知識を持つことは悪い考えです。それは非常に脆い設計になります。メソッド呼び出しの一部として渡されるすべてのクラスに準拠できるインターフェイスを定義する方がよいかもしれません。次に、呼び出しメソッドはクラスAによって実行されます。それをインターフェイスにすることは、Aがそれを呼び出すクラスに関する特定の知識を持っていないことを意味します。
別のオプションは、デコレータは、メソッド呼び出しを実装し、事前に物事を行うと、外部のAPIを考えるクラスA.
への転送電話をかける投稿することができますA.周りのデコレータを使用することで、春のインターセプタはあるかもしれません良い解決策。
それはすべてあなたがしようとしているものになります。しかし、私はクラスAがこのようなことをしていることは、設計思想が貧弱であることを示唆しています。
2番目のアプローチでは、キャプチャされた情報だけがクラス名です...あまり役に立ちません。 – adrianboimvaser
@adrian:唯一の機能要件に依存します:) OPが解決する必要のある具体的な問題については、十分ではないかもしれませんが、彼の質問では何も教えていません。ずっと良い解決策があるかもしれません。私はどこかのオブザーバー、戦略、さらには訪問者の匂いがします。 'StackTraceElement'には' getMethodName() 'もあります。 – BalusC
つまり、メンバーデータにStackTraceElementでアクセスすることはできません。 – adrianboimvaser