还不能算是classloader问题,其实是一个移植问题。
我在jdk1.4下自己开发了一个doer.Queue的类,
我的另一个类XXX中有如下的import
import java.util.*;
import doer.*;
现在我要把这个类XXX直接运行在JDK1.6上,我想知道是否已可以运行起来。
我的担心是这样的,在JDK1.6的java.util包下,增加了一个Queue类,与我原来的类同名了。
这种情况下,如果用JDK1.6重新编译原来的类肯定会出compile-time error。
目前我想研究的是,如果我直接用在JDK1.4下编译好的类在JDK1.6下运行,会不会出现问题。
也就是说,1.4编译好的类,在1.6上运行时是否会发现自定义的类与java.util.Queue同名,
进而报错。

解决方案 »

  1.   

    doer.Queue q = new Queue();
    java.util.Queue q2 = new Queue();这就可以咯
      

  2.   

    那就不要import,直接在使用的时候把类名写完整
      

  3.   

    楼长的诸位,多谢回答。
    修改import,使用单一引用(Single-Type-Import)当然是最简单的解决办法。
    但是这个是需要重新编译的。
    我的问题是希望知道了解不重新编译,直接在JRE1.6上使用1.4编译的类是否可行。
    我并不想去研究如何同通过修改source回避这个问题,
    而是想通过这个问题来研究Javac编译时如何处理import,
    java在运行时如何处理import的。
      

  4.   

    先说说我的研究
    我通过反编译1.4编译的class发现,class中的import部分发生了变化
    源代码:
      import java.util.*;
      import doer.*;
    反编译代码:
      import java.util.Hashtable;
      import doer.Queue;
    这样的话,当然是可以运行的。
    但是好像并不是任何一种情况反编译出的结果都是如上面一样把需要import的类转换成Single-Type-Import
    我希望了解这里面的原理
      

  5.   

     建议需要哪个类import哪个,不要一次性import一个包,虽然不会影响运行效率,但会影响编译效率,也容易出现重名。
    编译解决方案:1、单独import每个类(前提是你确定不会用到java.util.Queue)
    2、每个类使用前用完整的名称,如doer.Queue运行时不会有影响,因为在编译时编译器会寻找相关.java文件进行编译,生成一个二进制class文件,即类的定位在编译时已经完成,所以1.4编译好的能够在1.6中运行
      

  6.   

    如果在jdk1.4编译后,直接在jre1.6运行,肯定没有问题。
    在编译时,所有的类全部都加上了package名,所以没有任何冲突。不过,建议最好在import语句中,详细列出所用的类。
    比如:import java.util.ArrayList;
    import doer.Queue;如有冲突,比如用到java.util.Queue,可以直接用
    java.util.Queue q = ...
      

  7.   

    没有问题,你在1.4下写的,表名没有用到1.6的Queue,那么就根本没import这个Queue。何来混淆呢!
      

  8.   

    不建议import *, 很容易搞重名了,
    重名的话就写完整类名吧.!
      

  9.   

    我错了,没看清
    你 import util.*了。这个就不好说了
      

  10.   

    在Eclipse中Ctrl+Shift+O就可以帮你把引入的星号拆开成特定的包喇~~~
      

  11.   

    即使不重新编译,试了下,也是优先使用你自定义的类的,jdk的是次优先,楼主呢?
      

  12.   

    如果这个类是在 JDK 1.4 中编译后的,那么在 JDK 6 中运行是不会报错。
      

  13.   

    具体用哪一个 Queue 是在编译时就确定的,在运行期是不会去确定用哪一个 Queue 的。
      

  14.   

    “次优先”是指,class寻找的优先顺序码?
      

  15.   

    通过,反编译,确实验证了这个说法。
    bao110908能给我提供一些官方点的参考资料吗?
    我好好学习一下!
    多谢了!另外,楼上很多人觉得我有些“较真”?
    其实这是需求使然,如果你在维护一个庞大的应用系统,
    这个系统的一部分类既没有代码也没有设计书,
    你如何把这些类从1.4执行环境移植到1.6环境,而保证不出现问题。
    这个时候,可能就需要了解这方面的知识了。
      

  16.   

    我是根据实验结果作了单次总结,能否泛化未知import java.util.*;
    import doer.*;
    如此使用Queue则是定位到doer包中,如火龙果所说是在编译期确定的,1.6向下兼容,所以应该没问题
      

  17.   

    现在问题比较明确了,就是火龙果说的,编译器确定需要link的class这个处理,
    是官方文档记载的,还是通过实验得出的。
    恕我愚钝,我目前看到的文档里面没有这方面的记载,
    所以想请教大家,是否看到过相关的参考资料。
      

  18.   

    当然存在,我已经不幸命中过不止一回了。
    我所举的例子就是从项目中抽取出来的,
    1.4开发当时使用了一个叫做Queue的类,这个类不幸被是现在1.6的java.util.Queue上了。
    你让我把原来的类改名吗?
    这个工作量不是改个名字这么简单的,
    我的调查系统中用到这个类的地方,
    再说说哦手里没有全部的source。另外,我觉得这个问题挺常见的,
    应该通过调查弄明白
      

  19.   

    这个问题是由java编译器采用的方法来处理import和package的机制。我也是书上看到的。具体的做法,lz需要去看java编译器的书。