2013-05-22 34 views
3

我試圖做一些事情,應該是很容易的,但一些如何我一直沒有重新編譯......添加方法現有的Java類,並與我的項目

的想法是把現有的Java類從Java庫(在本例中的Java太陽) 稍作修改..重新編譯的類,並使用修改後的類在我們的項目

的步驟(我把String.java從java.lang中的舉例)

  1. 修改String String.java加入:

    public int zzz() { 
         return 123; 
        } 
    

    只是在類的構造函數下。

  2. 重新編譯String.java

    javac -d String String.java 
    
  3. 罐子-CF編譯後的文件 這是結果:罐子-vtf String.jar:

    0 Wed May 22 10:31:06 IDT 2013 META-INF/ 
    68 Wed May 22 10:31:06 IDT 2013 META-INF/MANIFEST.MF 
    9763 Wed May 22 10:30:44 IDT 2013 java/lang/String$1.class 
    1232 Wed May 22 10:26:04 IDT 2013 java/lang/String$CaseInsensitiveComparator.class 
    17269 Wed May 22 10:26:04 IDT 2013 java/lang/String.class 
    
  4. 寫短主類:

    public class main { 
    
    /** 
    * @param args 
    */ 
    public static void main(java.lang.String[] args) { 
        // TODO Auto-generated method stub 
        java.lang.String s = new java.lang.String(" xxx "); 
        s = s.concat("bla bla"); 
        System.out.println(s); 
        System.out.println(s.zzz()); 
    
        } 
    
    } 
    

(我想java.lang.String中,只是字符串時獲得相同的行爲。)

5.compile我main.java與修改後的String類

javac -Xbootclasspath/p:String.jar main.java 

6.run主要

java -Xbootclasspath/p:String.jar main 

給了我們以下的輸出:

[email protected]:~/work/sand_box$ java -Xbootclasspath/p:String.jar main 
xxx bla bla 
Exception in thread "main" java.lang.NoSuchMethodError: java.lang.String.<init>([CZ)V 
    at java.lang.Integer.toString(Integer.java:333) 
    at java.lang.Integer.toString(Integer.java:136) 
    at java.lang.String.valueOf(String.java:2948) 
    at java.io.PrintStream.print(PrintStream.java:597) 
    at java.io.PrintStream.println(PrintStream.java:736) 
    at main.main(main.java:12) 

我不知道我在做什麼錯誤 有人可以請擺脫這個請點亮嗎?

10x給所有的貢獻者。

+0

你想重新編譯'String'類沒有任何它需要在類路徑中相關類的? – vikingsteve

+0

@vikingsteve不javac從正在使用的jdk中獲取所有必需的類? 在我的情況: Java版本 「1.7.0_11」 的Java(TM)SE運行時環境(建立1.7.0_11-B21) 的HotSpot的Java(TM)64位服務器VM(建23.6-B04,混合模式) /usr/lib/jvm/java-7-oracle/jre/bin/java –

+0

有趣的一點,但是因爲你試圖從jdk重新編譯一個類,所以我想假設所有的jdk源代碼都必須到位(?) – vikingsteve

回答

0


從我的角度PT它會更好,只是延長String,而不是重新編譯JDK類的修改版本
如:public class String extends java.lang.String
這樣,你會在創建一個新的String類你的包
當然,根據你的需求,這可能不是最好的選擇
但總的來說,我認爲直接修改JDK類是不好的主意 - 至少如果你不打算包含(並重新編譯)所有來自源代碼的SDK

KR
弗洛裏安

+0

以及這不是真的適合我的需求... –

+0

那麼你到底需要什麼? – FloF

+0

我想覆蓋現有的java類覆蓋而不擴展的原因是因爲 –

相關問題