24

この件に関して、少しでもお役に立てればと思います

例:

public class A {
    private void foo() {
        //Who invoked me?
    }
}

public class B extends A {}

public class C extends A {}

public class D {
     C.foo();
}

これが基本的なシナリオです。foo()私の質問は、メソッドが誰がそれを呼び出しているかをどのように知ることができるのですか?

編集: 基本的に、データベース レイヤーを実行しようとしていますclass A。SQL ステートメントを生成するメソッドを作成します。このようなステートメントは、呼び出し元のすべてのpublicプロパティの値を取得することによって動的に生成されますclass

4

13 に答える 13

37

最も簡単な方法は次のとおりです。

String className = new Exception().getStackTrace()[1].getClassName();

しかし実際には、これはかなりコストのかかる作業であるため、何らかのロギング目的でない限り、これは必要ありません。これが解決策だとあなたが考える問題は何ですか?もっと良い提案ができるかもしれません。

編集:次のようにコメントしました:

基本的に私はデータベース レイヤーを実行しようとしています。クラス A では、SQL ステートメントを生成するメソッドを作成します。このようなステートメントは、呼び出し元のクラスのすべてのパブリック プロパティの値を取得することによって動的に生成されます。

次に、 HibernateiBatis、またはお好みのJPA 実装など、既存のORM ライブラリを探すことを強くお勧めします。

于 2009-11-08T13:35:39.873 に答える
16

おそらくあなたのユースケースでは、次のように、呼び出し元のクラスをメソッドに渡すのが理にかなっています。

public class A { public void foo(Class<?> c) { ... } }

そしてそれを次のように呼びます:

public class B { new A().foo(getClass() /* or: B.class */ ); }
于 2009-11-08T13:52:06.680 に答える
3

foo() はプライベートなので、呼び出し元は常にクラス A になります。

于 2009-11-08T13:38:02.420 に答える
1

スタック トレースから: http://www.javaworld.com/javaworld/javatips/jw-javatip124.html

于 2009-11-08T13:35:59.513 に答える
0

何らかの理由で上記の回答が例外処理に言及し始めたため、私はこれに答えています-元の質問は例外とは何の関係もありませんでした。

したがって、問題のメソッドの呼び出し元を特定しようとする代わりに、具体的には、派生クラスの SQL ステートメントを生成する基本クラスの作成を扱う詳細情報を提供するために、OO ソリューションを次に示します...

  1. 基本クラスを抽象化し、SQL ステートメントを構築するために必要なデータを返す抽象メソッドを含めます。

  2. これには次のようなメソッドが含まれます...

    getColumnList() getFromTable() getJoinedTables() getFilterColumns()

  3. 基本クラスは、SQL ステートメントを作成するために必要なすべての詳細について派生クラスを呼び出すため、誰がそれを呼び出しているかは気にしません。基本クラスは、派生クラスが抽象であるため、これらのメソッドの実装を提供することを認識しています。

これを実装する別の方法は、上記のメソッドとのインターフェイスを受け取り、これらのメソッドを介して渡されたインスタンスで動作する SQLGenerator クラスを用意することです。このために、上記の抽象メソッドをインターフェイスに移動し、SQL 関連のすべてのクラスを実装する必要があります。

リスト項目

于 2021-12-21T00:15:36.490 に答える
-2

多分答えは

public class CallerMain {

  public void foo(){
    System.out.println("CallerMain - foo");
    System.out.println(this.getClass()); //output- callerMain
  }
  public static void main(String[] args) {
    A a = new A();
    CallerMain cm = new CallerMain();
    cm.foo();
  }
}

class A{
  public void foo(){
    System.out.println("A - foo");
    System.out.println(this.getClass());//output- A
  }
}
于 2013-11-25T20:23:33.350 に答える