1

どのクラスがメソッドを呼び出したかを知るにはどうすればよいですか?

class A {
   B b = new B();

   public void methodA() {
    Class callerClass = b.getCallerCalss(); // it should be 'A' class
   } 
}

class B {
 public Class getCallerCalss() {
   //... ???
   return clazz;
 }
}
4

4 に答える 4

4

これは で簡単に実行できThread.currentThread().getStackTrace()ます。

public static void main(String[] args) {
    doSomething();
}

private static void doSomething() {
    System.out.println(getCallerClass());
}

private static Class<?> getCallerClass() {
    final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    String clazzName = stackTrace[3].getClassName();
    try {
        return Class.forName(clazzName);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return null;
    }
}

[3]が使用される理由[0]は、がThread.currentThread()、が、が、そして最後にがであるためです。別のクラスを入れると、正しいクラスが返されることがわかります。[1]getCallerClass[2]doSomething[3]maindoSomething

于 2012-09-24T15:24:36.600 に答える
3

スタックトレースを観察する方法があります

StackTraceElement[] elements = Thread.currentThread().getStackTrace()

Javadoc

配列の最後の要素は、スタックの一番下を表します。これは、シーケンス内で最も新しいメソッド呼び出しです。

于 2012-09-24T15:14:36.137 に答える
3

スタック トレースの 2 番目の要素をフェッチすることで、呼び出し元クラスのクラス名を取得できます。

final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
System.out.println(stackTrace[1].getClassName());

クラスのgetClassNameメソッドはa で返るので、残念ながらオブジェクトは取得できません。StackTraceElementStringClass

于 2012-09-24T15:15:34.057 に答える
0

試してみてくださいThrowable.getStackTrace()

新しいものを作成しますThrowable..それを投げる必要はありません:)。

未テスト:

Throwable t = new Throwable();
StackTraceElement[] es = t.getStackTrace();
// Not sure if es[0] would contain the caller, or es[1]. My guess is es[1].
System.out.println( es[0].getClass() + " or " + es[1].getClass() + " called me.");

明らかに、何らかの関数 ( getCaller()) を作成している場合は、スタック トレースの別のレベルに移動する必要があります。

于 2012-09-24T15:13:56.183 に答える