将方法添加到现有java类并使用我的项目重新编译

时间:2013-05-22 07:47:01

标签: java compilation runtime-error javac sun

我正在尝试做一些非常容易的事情,但有些事情我会一直失败......

这个想法是从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());
    
        }
    
    }   
    
  5. (我在尝试java.lang.String和String时会遇到相同的行为。)

    5.使用修改后的String类

    编译我的main.java
        javac -Xbootclasspath/p:String.jar main.java
    

    6.run main

    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倍。

1 个答案:

答案 0 :(得分:0)


从我的观点来看,最好只扩展String而不是重新编译JDK类的修改版本
例如:public class String extends java.lang.String
这样您就可以在包中创建一个新的 String 类 当然,根据您的需要,这可能不是最好的选择 但总的来说,我认为直接修改JDK类并不是一个好主意 - 至少如果你不打算自己包含(并重新编译)源代码中的所有SDK,那么

KR
弗洛里安