2011-01-21 1 views

答えて

3

最も簡単なのは、呼び出し側または少なくともいくつかのヒントをコンストラクタまたはメソッドの引数として渡すことです。

Other other = new Other(this); 
// or 
other.doSomething(this); 

厄介なのは、スタックトレースに基づいて解読することです。

public void doSomething() { 
    StackTraceElement caller = Thread.currentThread().getStackTrace()[2]; 
    String callerClassName = caller.getClassName(); 
    // ... 
} 
+1

2番目のアプローチでは、キャプチャされた情報だけがクラス名です...あまり役に立ちません。 – adrianboimvaser

+1

@adrian:唯一の機能要件に依存します:) OPが解決する必要のある具体的な問題については、十分ではないかもしれませんが、彼の質問では何も教えていません。ずっと良い解決策があるかもしれません。私はどこかのオブザーバー、戦略、さらには訪問者の匂いがします。 'StackTraceElement'には' getMethodName() 'もあります。 – BalusC

+0

つまり、メンバーデータにStackTraceElementでアクセスすることはできません。 – adrianboimvaser

0

コンストラクタに加えて、静的初期化ブロックまたは初期化ブロックを使用できます。

私はあなたの質問に誤解していると思いますが、私は上記で書いたものを残します。

ご要望に応じて、AspectJもご覧ください。あなたの目標を達成するためのきれいな方法を提供するかもしれません。

3

一般に、クラスがそれを呼び出す人物の知識を持つことは悪い考えです。それは非常に脆い設計になります。メソッド呼び出しの一部として渡されるすべてのクラスに準拠できるインターフェイスを定義する方がよいかもしれません。次に、呼び出しメソッドはクラスAによって実行されます。それをインターフェイスにすることは、Aがそれを呼び出すクラスに関する特定の知識を持っていないことを意味します。

別のオプションは、デコレータは、メソッド呼び出しを実装し、事前に物事を行うと、外部のAPIを考えるクラスA.

への転送電話をかける投稿することができますA.周りのデコレータを使用することで、春のインターセプタはあるかもしれません良い解決策。

それはすべてあなたがしようとしているものになります。しかし、私はクラスAがこのようなことをしていることは、設計思想が貧弱であることを示唆しています。

関連する問題