1

クラス A などの特定のクラスがさまざまなクラスによって呼び出されることがわかっている場合、その呼び出し元によって情報を取得することは可能でしょうか?

外部クラスがクラス A のメソッドを呼び出す前に、いくつかの事前/事後操作を実行しようとしています。

4

3 に答える 3

3

誰がそれを呼んでいるのかをクラスが知っていることは、一般的に悪い考えと考えられています。それは非常に脆いデザインになります。おそらく、より良い方法は、メソッド呼び出しの一部として渡される、任意のクラスが準拠できるインターフェースを定義することです。次に、呼び出しメソッドをクラスAで実行できます。これをインターフェースにするということは、Aがそれを呼び出しているクラスに関する特定の知識を持っていないことを意味します。

もう1つのオプションは、Aの周りにデコレータを使用することです。デコレータはメソッド呼び出しを実装し、クラスAへの転送呼び出しを行う前後に処理を実行できます。

外部APIについて考えると、スプリングインターセプターは良い解決策かもしれません。

それはすべてあなたがやろうとしていることに帰着します。しかし、この種のことを行うクラスAは、設​​計のアイデアとしては不十分だと思います。

于 2011-01-21T02:37:37.283 に答える
3

最もクリーンな方法は、呼び出し元自体または少なくともいくつかのヒントをコンストラクターまたはメソッド引数として渡すことです。

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

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

public void doSomething() {
    StackTraceElement caller = Thread.currentThread().getStackTrace()[2];
    String callerClassName = caller.getClassName();
    // ...
}
于 2011-01-21T02:22:51.923 に答える
0

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

class A
{

   private Object a;

   {
      // Arbitrary code executed each time an instance of A is created.
      System.out.println("Hey, I'm a brand new object!");
      System.out.println("I get called independently of any constructor call.");
   }

   static
   {
      // Arbitrary *static* code
      System.out.println("Some static initialization code just got executed!");
   }

   public A()
   {
      // Plain-Jane constructor
      System.out.println("You're probably familiar with me already!");
   }
}

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

要件に応じて、AspectJを確認することもできます。それはあなたの目標を達成するためのクリーンな方法を提供するかもしれません。

于 2011-01-21T02:23:51.810 に答える