2010-07-26 81 views
1

我想編譯jdk本身。我的意思是,我想修改jdk中的String.class以查看系統中創建的字符串對象。有沒有辦法修改jdk中的類?當我嘗試通過修改rt.jar來修改源代碼時,我得到了錯誤。如何編譯jdk本身

java.lang.NullPointerException 
     at java.util.Hashtable.put(Hashtable.java:394) 
     at java.lang.System.initProperties(Native Method) 
     at java.lang.System.initializeSystemClass(Unknown Source) 

可能是簽名問題。

回答

1

這看起來不像簽名問題。它看起來像你改變了導致哈希表引用空指針的東西。檢查你所做的改變,看看它爲什麼這樣做。回想一下,Java在一些條件下保持對字符串常量的內部引用。我猜你破壞了其中之一。

0

有什麼辦法可以修改jdk中的類嗎?

那麼,您可以從源代碼下載,修改和構建Java 6的OpenJDK版本。有關於如何在OpenJDK site上執行此操作的信息。

但請注意,對低級別Java類(例如String)所做的更改可能會產生難以讓非專家理解的效果。結果很可能是JVM失敗,導致printlnprintStackTrace()失效。

0

還有另一種方法:你下載java.lang.String原始源代碼,做你的修改並編譯只有這個類。

當您啓動主程序時,請注意加載類時:首先加載您的String類然後加載java運行時類。請參考java manual和-Xbootclasspath/p選項以正確的順序執行。

0

安裝JDK時,您也可以選擇安裝源代碼。這樣做。或者單獨下載資源。然後

  • 展開src.zip並獲取String.java文件。
  • 創建一個包含String.javajava/lang的新項目。
  • 根據您的需要更改它。
  • 只是編譯它。
  • 將類放入JDK的bootclass路徑中。請參閱More infos on Bootclassbath
  • 運行您的應用程序。

java -Xbootclasspath/p:<changed String classpath> -cp <regular classpath> <your application main class>

但改變JDK可能不是一個好主意,你不能出貨改變的JDK(至少1.6)由於許可限制。

是的,你的問題很可能在其他地方。請記住選擇不中斷 ;-)

+0

即使Sun/Oracle 1.6也有限制。 IIRC,IANAL:根據JRL,您可以分享變更以進行研究。 JIUL允許在*內部*生產系統中使用更改。 OpenJKD 6/6-open(早期OpenJDK 7的後端)是具有CLASSPATH異常的GLP。 – 2010-07-26 12:21:49

+0

你說得對,我的意思是包括在內。我想OpenJKD是免費的,但我不知道... – 2010-07-26 22:32:27