2009-06-08 100 views
1

我目前正在爲我的Java項目開發調試/錯誤處理工具。這是一個長效的方法,但是有沒有辦法打印出發送到方法中的參數的值?有沒有辦法查看發送到Java中的方法的參數的值?

調用該方法時,JVM必須存儲它們。無論如何,我可以抓住這些價值觀?

我的首要目標就是叫我自己printArguments()方法,它應該 - 不知何故 - 打印出來的參數,不管我是什麼方法

任何人有任何想法如何,我可以解決這個問題?或者也許也許我可以訪問其他類似的信息?我想在某個時間獲得儘可能多的信息,例如變量。

任何意見將不勝感激! :)

回答

1

您將需要詳細闡述一點。你是從Java源代碼構建你自己的編譯器嗎?你在建立你自己的字節碼解釋器嗎?你想鉤入現有的字節碼解釋器嗎?答案完全取決於你所關注的階段。

如果您有權訪問Java源代碼,那麼面向方面的編程可能適合您。您可以使用它將printArguments調用自動編織到每個常規方法調用中。

3

我目前正在爲我的Java項目開發調試/錯誤處理工具。

您是使用JPDA?如果是這樣,你可能會得到一個method entry event,得到event's thread並從當前stack frame讀取參數。如果您不熟悉它,請參閱此JPDA demo blog post

如果你想避免在調試模式下運行,那麼(如其他人所說)AOP是一個很好的解決方案。您可以使用instrumentation和/或byte code manipulation推出自己的解決方案,但這是一種更爲複雜的方法。

0

我可能已經有點blury。

這是一個標準的J2SE項目。使用標準的編譯器和運行時,沒有什麼奇特的。我想盡可能多地使用J2SE庫,而不是將新的庫包含到項目中,或者使用外部工具(如Eclipse),因爲它將是dist。到非開發機器。

+0

Stackoverflow不是一個線程論壇。所以請不要將後續作爲答案。請張貼他們作爲對推薦答案的評論。 – guerda 2009-06-08 13:13:24

0

我現在讀了一大堆,但我仍然不確定要使用什麼。

Visual VM看起來像一個外部工具,我不感興趣。爲了使用Proxy,我必須用它包裝項目中的所有類,這是我不感興趣的。

歸結爲JPDA和AOP,都似乎複雜,然後他們應該:)我不知道這兩個我可以在同一個運行時使用更容易,沒有在調試模式下啓動應用程序或創建一個用一種新的OAP語言寫了一些東西。

我希望只是一個簡單的方法來轉儲方法參數,而不知道什麼方法,參數或類型的數量。

理論上,由於反射,我可以獲得方法名稱和參數類型。但不是他們的價值觀。

任何迴應將有所幫助。

0

如果你想只依靠JDK庫(1.4+),我能想到的將記錄添加到您的所有方法,例如唯一的東西,

(我使用的是共享日誌記錄的語法,因爲我不熟悉Java日誌記錄細節)

public void foo(String bar) { 
    log.debug("entering foo(" + bar + ")"); 
    //... 
} 
+0

這就是如果你真的知道的論點。我想自動解決這個問題。 – corgrath 2009-06-08 13:06:45

1

對原始問題的簡短回答是否定的。一個方法的參數到達棧中的槽,但是這個方法可以自由地使用這些槽來存儲其他的東西,所以你不能在後面知道這些槽的內容是參數還是別的東西。這只是談論在字節碼中表達的方式 - 在本地代碼中實際發生的情況可能完全不同。

在任何情況下,都無法反射性地訪問java中的局部變量,所以即使參數被保留下來,也無法得到它們。

JPDA是非侵入式訪問方法參數的唯一方法,恐怕。

+0

感謝您的評論。我想看看JPDA :) – corgrath 2009-06-08 14:49:54

1
void PrintValues(Object... params){ 
    for(object o : params){ 
     System.out.println(o.toString()); 
    } 
} 

然後,在任何方法中,你都知道你的參數可以將它們傳遞給PrintValues。

void SomeMethod(String p1, int p2, StringBuilder p3){ 
    PrintValues(p1, p2, p3); 
} 

我是否過於簡單化的要求?聽起來像你想要的是非常適合AOP /反射,但如果你對他們死了,這可能會做一些你想要的。

+0

感謝您的評論。正如我寫給傑克·萊,這需要我指定參數。這是一個很好的解決方案,但我寧願開發一些東西,所以我只需要調用PrintValues(),它會自動循環訪問參數:) – corgrath 2009-06-08 13:26:18

0

我不確定你的要求,但你看看BTrace。你可以做到你想要的東西。

此外,您可以將您的調試/錯誤處理工具基於BTrace - 提供一組特定於您的應用程序的腳本,然後以特別的方式運行它們。 GalssFish v3做了類似的事情。

相關問題