2013-11-04 53 views
2

我可以識別我的通話對象嗎?
我可以創建stacktrace對於類名A但我如何訪問A的對象?如何識別調用對象?

class A{ 
    void method(){ 
     new B().method(); 
    } 
} 

class B{ 
    void method(){ 
     // can i recognize Object A ???? 
    } 
} 
+4

不要這樣做!生產這種緊密耦合並不是一個好主意。你爲什麼認爲你需要這個? –

+0

我知道,我知道..但有時 - 你知道一種方法來找到A的對象嗎? –

+0

有時候是什麼?我可以合理想到的只有2個部分需要這些信息:安全檢查(參見'SecurityManager',這已經完成了)以及可能的日誌記錄(請參閱您最喜歡的日誌框架,也已完成)。 –

回答

4

使用StrackTraceElement

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 

的頂級元素是你在找什麼。

也通過this

+0

非常感謝Maroun –

+0

爲什麼你鏈接到一些第三方網站,只是複製已經[在官方文檔](http://docs.oracle.com/javase/7/docs/api /java/lang/StackTraceElement.html)?特別是因爲你的答案已經鏈接到JavaDoc本身。 –

+0

僅僅是因爲表格形式的小方法摘要。提供參考作爲源,所以它不是剽竊 –

2
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace() 

的Javadoc:

陣列的最後一個元素代表堆棧, 這是該序列中的至少最近的方法調用的底部。

和你可以從每個StackTraceElement的

得到什麼

http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html

getClassName() 
getFileName() 
getLineNumber() 
getMethodName() 
+0

我尋找調用對象,而不僅僅是調用類。 –

1

如果你真的需要做到這一點,那麼你應該將其納入代碼的文檔。

class A{ 
    void method(){ 
     new B().method(this); 
    } 
} 

class B{ 
    void method(A a){ 
     System.out.println("I recognize 'a' as " + A); 
    } 
}