例: AとBの 2 つのクラスがあるとします。どちらのクラスもCのメソッドを呼び出すことができます(例:init()
メソッド)
Cから、呼び出しがどこからのものか (クラスAまたはクラスBから) をどのように知ることができますか?
例: AとBの 2 つのクラスがあるとします。どちらのクラスもCのメソッドを呼び出すことができます(例:init()
メソッド)
Cから、呼び出しがどこからのものか (クラスAまたはクラスBから) をどのように知ることができますか?
これは役に立つかもしれません:
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
これを使用して、StackTraceElement
配列の最初の要素がスタック上の最新のメソッド呼び出しシーケンスである配列内の現在のスレッドのスタック トレースを取得できます。
返された配列の長さがゼロでない場合。
、 などのStackTraceElement
メソッドがあり、呼び出し元のクラス名またはメソッド名を見つけるために使用できます。getClassName
getMethodName
正しく行うには、C のメソッドにその情報を提供する必要があります。たとえば、列挙型またはクラス パラメーターを使用します。
public void init(Object otherArg, Class<?> caller) {
...
}
また
public void init(Object otherArg, CallerEnum caller) {
...
}
しかし、気にしない場合は、スタック トレースを使用する別の方法があります。Get current stack trace in Javaを見て、スタックの一番上から 2 番目のStackTraceElementを使用して、現在のスタック トレースを呼び出したメソッドを取得します。
どこかのネットから拾ってきた...
private static final int CLIENT_CODE_STACK_INDEX;
static {
// Finds out the index of "this code" in the returned stack trace - funny but it differs in JDK 1.5 and 1.6
int i = 0;
for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
i++;
if (ste.getClassName().equals(MyClass.class.getName())) {
break;
}
}
CLIENT_CODE_STACK_INDEX = i;
}
public static String getCurrentMethodName() {
return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX].getMethodName();
}
public static String getCallerMethodName() {
return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX+1].getMethodName();
}
もっと簡単な解決策を見つけました(私にとっては:D)
public <T> void init(Class<T> clazz) {
if (!clazz.getSimpleName().equals("MyClassName")) {
// do something
}else{
// do something
}
}