回答
要做到這一點沒錯,你應該通過枚舉或類參數提供C'S方法與信息,例如:
public void init(Object otherArg, Class<?> caller) {
...
}
或
public void init(Object otherArg, CallerEnum caller) {
...
}
但是,如果你不在意,還有另一種方式使用堆棧跟蹤。看看Get current stack trace in Java並使用堆棧頂部的第二個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();
}
我懷疑不同的深度取決於getStackTrace內部的調用級別的數量,它是在拍攝快照之前調用的。它也可能因供應商不同而不同。 –
在類X.foo上執行 - 將返回「foo」,靜態塊將阻止您引用的問題。 – urir
我試圖解釋爲什麼需要靜態塊,因爲您有評論「有趣,但它在JDK 1.5和1.6中有所不同」 –
這可能是有用的:
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
你可以用它來獲取當前線程的堆棧跟蹤的
StackTraceElement
數組,其中數組的第一個元素是最新的方法調用序列在堆棧上前提是返回的數組長度不爲零。
StackTraceElement
有類似getClassName
,getMethodName
等方法,可以使用這些方法來查找調用方類名稱或方法名稱。
我發現了一個簡單的解決方案(對我來說:d)
public <T> void init(Class<T> clazz) {
if (!clazz.getSimpleName().equals("MyClassName")) {
// do something
}else{
// do something
}
}
- 1. 當前方法是否可以知道調用了哪種方法?
- 2. 如何知道哪個活動調用了當前活動?
- 3. 如何知道我目前使用哪種方法
- 4. 我怎麼知道我已經安裝了哪個Facebook iOS SDK
- 5. 如何知道哪一行已經調用觸發器?
- 6. 如何知道在哪裏定義了javascript方法,以及使用螢火蟲調用了哪種方法
- 7. 如何知道方法已經被添加到一個類
- 8. 調用一個方法,但不跟我知道從哪個類
- 9. 一個班級如何知道誰調用了它的方法?
- 10. 如何獲得resharper知道我的變量不爲空後,我已經調用了它的擴展方法?
- 11. 這個模型工廠如何知道使用哪種方法?
- 12. 我如何知道我已經完成了交互模式?
- 13. 我如何知道Rails已經加載/緩存了一個Activerecord類的屬性?
- 14. 我如何知道reloadData已經完成
- 15. 如何知道調用哪個方法的對象?
- 16. 界面如何知道哪個類的方法調用?
- 17. 我們如何知道threadPoolExecutor已經完成執行
- 18. 當我已經有一個使用GET方法?在我的Querystring
- 19. 如何找到調用方法,當我們知道被調用的方法在iphone
- 20. 如何知道哪個用戶付了?
- 21. 我如何知道哪個下拉菜單有當前焦點
- 22. 如何知道哪個枚舉當前用完了多個枚舉
- 23. 如何知道哪個FileSystemWatcher正在調用方法?
- 24. 它如何知道調用哪個方法?
- 25. 如何知道.NET Remoting中哪個客戶端調用方法?
- 26. 有一種方法可以知道json代表了哪種類型?
- 27. 如何知道一個活動的生命週期方法已經結束
- 28. Firebreath如何知道我的方法是否未經調試而調用
- 29. 我們如何知道光標已經移動到edittext的下一行android
- 30. 我如何知道我已經編寫了足夠多的測試用例?
你可以看一下堆棧跟蹤,但這是很少一個好主意(和它相對較慢),而應該傳遞到C所有重要信息。順便說一句你可以傳遞一個類作爲參數,例如'init(A.class);' –
技術上它可能很有趣,但是一般來說代碼不應該依賴調用者,它應該取決於它的參數 –
你能給我一個例子嗎?謝謝 –