我正在尝试做一些应该很容易的事情,但是我一直在失败……
这个想法是从java存储库(在我们的例子中是java sun)中获取现有的java类,对其进行一些修改。重新编译该类并在我们的项目中使用修改后的类
步骤(例如,我从 java.lang 中获取了 String.java)
通过添加以下内容修改 String String.java:
public int zzz() { return 123; }
就在类构造函数下。
重新编译 String.java
javac -d String String.java
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
编写简短的主类:
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 倍。