我把java.lang.String.class改了,其实也没有什么改动,只不过加了个属性变量,还加了getter,setter,编译成功,没报错,然后重装把新的String.class放入rt.jar包里面,然后我的Eclipse就不能启动了。请问这是什么原因呢?

解决方案 »

  1.   

    错误跟Eclipse找不到JDK路径的错误是一样的,不信大家可以试试看。
      

  2.   

    可能会牵连到别的父类吧,整个jdk瘫痪了,所以报这个错误
      

  3.   

    如果不用Eclipse,在命令窗口中编译一个最简单的Class类,main方法里面只有一句String s="11";报错为:---------- javac ----------
    TMain.java:3: cannot access String
    bad class file: .\String.class
    class file contains wrong class: java.lang.String
    Please remove or make sure it appears in the correct subdirectory of the classpath.
    public static void main(String args[])
                                    ^
    1 errorOutput completed (1 sec consumed) - Normal Termination把String.class替换成原来的,一切就正常了。
      

  4.   

    重新编译String.java后,生成"String$1.class","String$CaseInsensitiveComparator.class","String.class"三个文件,我保证我没放错路径的。
      

  5.   

    你要搞个String ,劝你还是用继承.要不你发布产品很麻烦.
      

  6.   

    修改了别人的类又没通过虚拟机检查,如果你读过深入JAVA虚拟机,你应该要做以下怀疑,SUN在发布自己的JRE标准API前对他们进行了私钥加密和数字签名,因为你的篡改,使得公钥解密的散列结果和原来进行加密时的不一致,所以没有通过安全检查,故报错。
    如果这一假设成立则结论是不要去动JRE规定的标准API。
      

  7.   

    在classLoad的时候有Parent委派安全机制的,所以String类肯定由最基本的ClassLoader来读取,因为是API类。发现修改过了,可能就不认了
      

  8.   

    你要搞个String ,劝你还是用继承.要不你发布产品很麻烦.String 貌似是final类型的class, 没有办法继承。如果要达成楼主的愿望,楼主可以这样:public class MyString {
     private String string = null;
     private Object yourProperty = null
     public MyString(String string) {
        this.string = string;
     }
     public Object getYourProperty() {
     }
     public void setYourProperty() {
     }
     // 以下实现所有Stringr的方法,具体实现时用String的实现
     public int indexOf()
     {
       return string.indexOf();
     }
     ...
     ...
    }
      

  9.   

    你改不了,以java 或者javax 开头的包,都做了安全性的识别。而且String 也设为final 类。有什么需求一定需要去改String 类吗?
      

  10.   

    原来是这样,我也猜到JVM会对一些基础类作了识别的。结贴。