2012-11-02 44 views
0

我有一些瘋狂的任務,聽起來像任務不可能。我需要通過一些方法來傳遞一些數據,這些方法我無法修改(只能修改最後一個)。例如:通過調用堆棧傳遞數據,無需修改方法

SomeData someData; //not passed in method1 
obj1.method1(...); 

這裏是OBJ1類代碼

obj1 { 
    someReturnClass method1(...) { 
     ... 
     obj2.method2(...); 
     ... 
    } 
} 

OBJ2和method2調用一些方法,他們得到objN.methodM前()。它甚至可以在單獨的線程中運行(所以,ThreadLocal不會幫助)。我需要訪問methodM中的someData,它不會通過此堆棧作爲參數傳遞。

我有一些概念可以通過異常和雙重運行methodM來獲得它,但它看起來很醜。

你有什麼想法,如何將someData傳遞給methodM()?

+1

要清楚:你的意思是你需要訪問一個方法激活的局部變量,一個你不能改變的方法,但是你知道存在的方法在棧上較低? – Marcin

+1

基本上,你需要某種(相對)靜態數據。這可能是一個「單例」,一些常見的可尋址對象中的實例字段,線程局部變量或少數其他事物。 –

+0

是的,我想過一些單身人士。但是以我的方法結束的幾個這樣的堆棧可能會同時運行。 – Oroboros102

回答

0

最後,我找到了解決辦法:

創建JAAS主題在主題的校長或憑據

Subject subject = new Subject(); 

數據放在什麼地方:

subject.getPublicCredentials().add(new String("Trololo")); 

得到這個主題,它的數據你需要的地方(即使在另一個線程中工作):

Subject subject = Subject.getSubject(AccessController.getContext()); 
System.out.println(subject.getPublicCredentials()); 

它只在一種情況下不起作用:線程在主題創建之前啓動。

0

我知道你需要訪問一個方法激活的局部變量,一個你不能改變的方法,但是你知道這個方法在棧上的位置較低。

這裏明顯的一點就是與Java調試架構的工作:http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/index.html

這將允許你檢查所有線程的堆棧。

+0

對於JPDA jvm需要在調試模式下運行。這對我的情況來說是個大問題。 – Oroboros102

+2

@ Oroboros102所以,你不能修改代碼,你不能在調試模式下運行它?在這種情況下,你不能這樣做。 – Marcin

+0

全局變量呢?他們不是非法的,只是不道德:) –

1

如果您不能以其他方式走私 - 例如通過將SomeData的引用添加到的某個其他對象中,並通過調用堆棧 - 那麼您最終必須使用全局變量。這當然是一個糟糕的設計,但考慮到你的限制,沒有別的可能。

您在評論中提到,您可能會對您的方法「主動」進行多次調用(是遞歸還是多線程?)在這種情況下,您需要擁有一個全局集合,並且擁有通過調用堆棧推斷從的數據中選擇集合的哪個元素的某種方式。

+0

在我奇怪的情況下,這種方法最適合。感謝這個簡單的想法,我甚至都沒有想過。 – Oroboros102

+0

@ Oroboros102:很高興爲你工作:) –