どのクラスがメソッドを呼び出したかを知るにはどうすればよいですか?
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;
}
}
どのクラスがメソッドを呼び出したかを知るにはどうすればよいですか?
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;
}
}
これは で簡単に実行でき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]
main
doSomething
スタックトレースを観察する方法があります
StackTraceElement[] elements = Thread.currentThread().getStackTrace()
配列の最後の要素は、スタックの一番下を表します。これは、シーケンス内で最も新しいメソッド呼び出しです。
スタック トレースの 2 番目の要素をフェッチすることで、呼び出し元クラスのクラス名を取得できます。
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
System.out.println(stackTrace[1].getClassName());
クラスのgetClassName
メソッドはa で返るので、残念ながらオブジェクトは取得できません。StackTraceElement
String
Class
試してみてください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()
) を作成している場合は、スタック トレースの別のレベルに移動する必要があります。