4

例: ABの 2 つのクラスがあるとします。どちらのクラスもCのメソッドを呼び出すことができます(例:init()メソッド)

Cから、呼び出しがどこからのものか (クラスAまたはクラスBから) をどのように知ることができますか?

4

4 に答える 4

3

これは役に立つかもしれません:

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
  • これを使用して、StackTraceElement配列の最初の要素がスタック上の最新のメソッド呼び出しシーケンスである配列内の現在のスレッドのスタック トレースを取得できます。

  • 返された配列の長さがゼロでない場合。 、 などのStackTraceElementメソッドがあり、呼び出し元のクラス名またはメソッド名を見つけるために使用できます。getClassNamegetMethodName

于 2012-10-11T08:13:47.917 に答える
3

正しく行うには、C のメソッドにその情報を提供する必要があります。たとえば、列挙型またはクラス パラメーターを使用します。

public void init(Object otherArg, Class<?> caller) {
    ...
}

また

public void init(Object otherArg, CallerEnum caller) {
    ...
}

しかし、気にしない場合は、スタック トレースを使用する別の方法があります。Get current stack trace in Javaを見て、スタックの一番上から 2 番目のStackTraceElementを使用して、現在のスタック トレースを呼び出したメソッドを取得します。

于 2012-10-11T08:01:31.757 に答える
1

どこかのネットから拾ってきた...

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();
}
于 2012-10-11T07:59:59.060 に答える
0

もっと簡単な解決策を見つけました(私にとっては:D)

public <T> void init(Class<T> clazz) {
     if (!clazz.getSimpleName().equals("MyClassName")) {
          // do something
     }else{
          // do something
     }
}
于 2012-11-05T12:47:15.757 に答える