3

我正在尝试做一些应该很容易的事情,但是我一直在失败……

这个想法是从java存储库(在我们的例子中是java sun)中获取现有的java类,对其进行一些修改。重新编译该类并在我们的项目中使用修改后的类

步骤(例如,我从 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
这样您将 String 在包中创建一个新类
当然,根据您的需要,这可能不是最佳选择
但总的来说,我认为直接修改 JDK 类并不是一个好主意——至少如果你不打算自己从源代码中包含(并重新编译)所有 SDK

KR
弗洛里安

于 2013-05-26T08:42:09.360 回答