2013-07-14 80 views
0

我有一個類的一個靜態方法和正被從一個對象或螺紋另一非靜態方法調用。
有沒有辦法知道從哪個線程或對象時,它被稱爲?
我認爲這是不可能的,我需要它沒什麼,只是想確認。知道呼叫者對象或線程從靜態方法

我的意思是這樣

class CallerID 
{ 
    public static void main(String ...s) 
    { 
     CallerID ob=new CallerID(); 
     ob.caller(); 
    } 
    void caller() 
    { 
     showCaller(); 
     System.out.println("In this method, ob = "+this); 
    } 
    static void showCaller() 
    { 
     //code to get caller object ob like it is printed in method caller() 
    } 
} 
+1

所以,你要調用對象,或當前線程?這些是完全不同的東西。 'Thread.currentThread()'返回當前線程。 –

+0

*「有沒有辦法知道它是從哪個線程或對象中被調用的?」*您的問題沒有意義。 – m0skit0

+0

這是不可能的,但您的實際問題可能會以更好的方式解決。告訴我們你真正想要達到的目標。 –

回答

1

你不能得到的對象調用。您可以獲取調用對象,線程和方法,但是如果您想要參考,則必須將this作爲參數。

1

其實你可以打印一個堆棧跟蹤知道從哪個線程和對象的叫法。

+0

不是對象,只是方法和類,並且不需要打印它。 –

1

您可以使用

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

看回溯並從此你可以找到來電者那裏。

+0

不是對象,只是類和方法。 –

1

線程可以用Thread.currentThread()被發現。 調用對象雖然無法找到。調用方法可以通過解析堆棧跟蹤來找到,儘管這可能會很慢。

1

你可以看看在線程的最新的堆棧跟蹤,通常它的第四個條目,或者您可以遍歷檢查:

StackTraceElement[] trace = Thread.currentThread().getStackTrace(); 
if(trace.length > 3){ 
    System.out.println("Called from method " + trace[3].getMethodName() + " of class " + trace[3].getClassName()); 
}