2011-03-21 60 views
0

所以基本上我只是想通過嘗試一個新的方法來調試幾個簡單的腳本,我過去成功地通過掛鉤URL.class(使用jdk的源代碼和重新綁定),但是我意識到如何在字符串之前打印出字符串?如何劫持String.class

我希望能夠寫入文件或打印出經過字符串類的任何字符串,但是如何在字符串類本身內創建管道方法?

I.e.一個char數組被傳遞到字符串中,我如何獲取它,將其作爲一個字符串並將其發送到字符串類中的print out命令?如果我太模糊,我會舉幾個例子。

+2

如果你真的想這樣做,你不能添加這行作爲String類中每個構造函數的最後一行嗎?的System.out.println(this.toString()); – RoflcoptrException 2011-03-22 00:07:12

+0

哦,我的上帝,我甚至沒有想到那麼簡單,我試圖通過自己的方法來管理每個輸出,我會在一秒鐘之內嘗試。謝謝。 – exclu 2011-03-22 00:08:13

+0

也許這太簡單了,但System.out.print(char c)一遍又一遍地重複你的假String類中的字符?您始終可以打印原始值。 – jbrookover 2011-03-22 00:12:30

回答

2

IMO,調整Java標準類的實現是一個非常糟糕的主意,即使您只是在嘗試和調試某些東西。問題是你可以非常糟糕地破壞事物。

例如,@Roflcoptr建議您爲每個String構造函數添加一個System.out.println(...)。但是如果PrintStream.println調用由於某種原因試圖構造一個字符串會發生什麼?如果在初始化流對象之前嘗試構造String ...,那麼在JVM自舉期間會發生什麼?

我不是說它不起作用。我不是說你不能使它工作。我是am說這樣的駭客很容易以驚人而可怕的方式失敗。

我的建議是找到另一種調試/診斷問題的方法。例如,在相關的String構造函數上設置一個斷點。

+0

這兩個問題都很容易解決:1.如果'println'真的做到了,可以使用ThreadLocal或StackTrace檢查來避免無限遞歸。 2.在程序開始時使用全局變量集以避免引導期間出現問題。也就是說,我完全同意你的建議。 – maaartinus 2011-03-22 03:13:21

+1

在某些情況下,堆棧跟蹤捕獲很可能會創建字符串。使用threadlocals或全局可能會更改類依賴關係,從而在引導過程中導致不同的類加載/初始化順序...並破壞其他內容。 – 2011-03-22 03:53:36

1

從JDK源代碼重新編譯的替代方法可能是使用aspect-oriented programming,它允許您向以前編譯的類添加或替換行爲。 AspectJ是支持面向方面編程的Java工具之一。

+1

AOP很糟糕。 AOP是針對一般問題的,你不能將它用於String之類的東西,而是要求真正的麻煩。如果每次使用/構造一個攔截器運行一個字符串,你的系統會變得難以忍受。攔截器會做什麼?打印一些意味着另一個字符串被創建... – 2011-03-22 01:21:38

+0

這個問題是關於*調試*,其中預期較慢的行爲。您對生產系統中AOP的個人反感並不重要。假設追蹤會創建一個新的字符串不一定是正確的。 – 2011-03-22 13:11:43