3

私はかなり簡単なはずのことをしようとしていますが、失敗し続けている方法もあります...

アイデアは、既存の Java クラスを Java リポジトリ (この場合は Java Sun) から取得し、少し変更することです。クラスを再コンパイルし、変更したクラスをプロジェクトで使用します。

手順 (たとえば、java.lang から String.java を取得しました)

  1. 以下を追加して String String.java を変更します。

    public int zzz() {
           return 123;
       }
    

    クラスコンストラクターのすぐ下。

  2. String.java を再コンパイルする

    javac -d String String.java
    
  3. jar -cf コンパイルされたファイル これは次の結果です: jar -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 と String だけを試しても同じ動作になります。)

5.変更された String クラスを使用して main.java をコンパイルします。

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

6.メインを実行

java -Xbootclasspath/p:String.jar main

次の出力が得られます。

myusername@machinename:~/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)

私は何が間違っているのか理解できません。誰かがこれに光を当ててください。

そこにいるすべての貢献者に10倍。

4

1 に答える 1

0


私の見解ではString、修正されたバージョンの JDK クラスを再コンパイルするのではなく、単に拡張する方がよいでしょう
。例:そうすれば、パッケージにpublic class String extends java.lang.String
新しいクラスを作成でき ます。 しかし、一般的には、JDK クラスを直接変更することはお勧めできません。少なくとも、ソースからすべての SDK を自分でインクルード (および再コンパイル) する予定がない場合は。 String


KR
フロリアン

于 2013-05-26T08:42:09.360 に答える