我正在尝试做一些非常容易的事情,但有些事情我会一直失败......
这个想法是从java存储库中获取现有的java类(在我们的例子中是java sun) 修改它..重新编译类并在我们的项目中使用修改后的类
这些步骤(例如我从java.lang中获取了String.java)
通过添加:
修改String String.javapublic 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.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倍。
答案 0 :(得分:0)
从我的观点来看,最好只扩展String
而不是重新编译JDK类的修改版本
例如:public class String extends java.lang.String
这样您就可以在包中创建一个新的 String
类
当然,根据您的需要,这可能不是最好的选择
但总的来说,我认为直接修改JDK类并不是一个好主意 - 至少如果你不打算自己包含(并重新编译)源代码中的所有SDK,那么
KR
弗洛里安