2012-10-11 24 views
4

示例:如果我有兩個類:AB。兩個類可以調用Ç的方法(例如:該方法init()我們如何知道哪種方法(java.class)已經調用了當前的一個

Ç,我們怎樣才能知道其中呼叫是從(從A類或類)?

+4

你可以看一下堆棧跟蹤,但這是很少一個好主意(和它相對較慢),而應該傳遞到C所有重要信息。順便說一句你可以傳遞一個類作爲參數,例如'init(A.class);' –

+4

技術上它可能很有趣,但是一般來說代碼不應該依賴調用者,它應該取決於它的參數 –

+0

你能給我一個例子嗎?謝謝 –

回答

3

要做到這一點沒錯,你應該通過枚舉或類參數提供C'S方法與信息,例如:

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

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

但是,如果你不在意,還有另一種方式使用堆棧跟蹤。看看Get current stack trace in Java並使用堆棧頂部的第二個StackTraceElement來獲取調用當前方法的方法。

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(); 
} 
+1

我懷疑不同的深度取決於getStackTrace內部的調用級別的數量,它是在拍攝快照之前調用的。它也可能因供應商不同而不同。 –

+0

在類X.foo上執行 - 將返回「foo」,靜態塊將阻止您引用的問題。 – urir

+1

我試圖解釋爲什麼需要靜態塊,因爲您有評論「有趣,但它在JDK 1.5和1.6中有所不同」 –

1

這可能是有用的:

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
  • 你可以用它來獲取當前線程的堆棧跟蹤的StackTraceElement數組,其中數組的第一個元素是最新的方法調用序列在堆棧上

  • 前提是返回的數組長度不爲零。 StackTraceElement有類似getClassName,getMethodName等方法,可以使用這些方法來查找調用方類名稱或方法名稱。

0

我發現了一個簡單的解決方案(對我來說:d)

public <T> void init(Class<T> clazz) { 
    if (!clazz.getSimpleName().equals("MyClassName")) { 
      // do something 
    }else{ 
      // do something 
    } 
} 
相關問題