解决方案 »

  1.   

    你把两个test.class弄成不一样试下就知道了啊,我也好奇这个问题。另外我知道的一些容器是自己改写了class loader的。像tomcat,war包里的jar会优先load到。如有两个版本的jar, tomcat lib下是老版本的,war里的新的,你的应用会访问到新版本的
      

  2.   


    其实我试验过了,我把Test.class打成jar包放到ext目下之后,在Test.java里添加了一个输出,然后执行,不过结果让我更困惑了
    1. 通过命令行java Test 执行,发现打印了输出语句,这说明是修改后的Test。 (难道ext目录下的Test没用吗???)
    2. 通过IDE(IntelliJ IDEA)执行,没有输出,是ext下的Test……(这……)
      

  3.   

    你IDE用的jdk和系统用的是一个吗?
      

  4.   


    你启发我了。IDE和命令行结果不一致是因为他们用的不是一个jre。
    IDE用的是%JAVA_HOME%/jdk1.6.0_45/jre
    而命令行用的是%JAVA_HOME%/jre
    我之前是吧test.jar放到了%JAVA_HOME%/jdk1.6.0_45/jre里面的lib/etc下,而IDE用的正是这个,所以不显示输出,而命令行没有。
      

  5.   

    都没搞明白你main方法是写在哪里的? 你到底想测试什么。首先类只有被用到才会被加载, main方法定义的那个类肯定会被加载。
     所以如果你定义main方法的那个类里面只有一句输出,根本都不会加载ext下面的东西。 再有类加载是按照全限定名来的,  如果你jar包里面的Test类跟测试的Test类全限定名都一样的话,且里面都定义了main方法, 我可以负责任的告诉你,jvm只会加载运行ext下面的Test.main, 而你自己的Test类根本都不会被加载 
      

  6.   


    我之前搞错了一点,ExtClassLoader加载的类位于%JAVA_HOME%/jre/lib/etc,而我把打包好的jar放到了%JAVA_HOME%/jdk1.6.0_45/jre/lib/etc里。纠正了这个错误后,实验结果正好相反。
    1. 用命令行执行没有输出,说明jvm加载到了jar包里的Test.class。
    2. 用IDE有输出,说明加载的是最新的修改后的Test
      

  7.   


    全限定名一样的。
    的确,我做实验也验证了修改后的Test类没有被加载,jvm只会加载ext下面的Test。
    所以无论在什么路径下,执行java Test 都不会有问题,因为jvm会在ext目录下找到Test.main。自己写的Test被“屏蔽了”,压根没用。