还不能算是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同名,
进而报错。
我在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同名,
进而报错。
java.util.Queue q2 = new Queue();这就可以咯
修改import,使用单一引用(Single-Type-Import)当然是最简单的解决办法。
但是这个是需要重新编译的。
我的问题是希望知道了解不重新编译,直接在JRE1.6上使用1.4编译的类是否可行。
我并不想去研究如何同通过修改source回避这个问题,
而是想通过这个问题来研究Javac编译时如何处理import,
java在运行时如何处理import的。
我通过反编译1.4编译的class发现,class中的import部分发生了变化
源代码:
import java.util.*;
import doer.*;
反编译代码:
import java.util.Hashtable;
import doer.Queue;
这样的话,当然是可以运行的。
但是好像并不是任何一种情况反编译出的结果都是如上面一样把需要import的类转换成Single-Type-Import
我希望了解这里面的原理
编译解决方案:1、单独import每个类(前提是你确定不会用到java.util.Queue)
2、每个类使用前用完整的名称,如doer.Queue运行时不会有影响,因为在编译时编译器会寻找相关.java文件进行编译,生成一个二进制class文件,即类的定位在编译时已经完成,所以1.4编译好的能够在1.6中运行
在编译时,所有的类全部都加上了package名,所以没有任何冲突。不过,建议最好在import语句中,详细列出所用的类。
比如:import java.util.ArrayList;
import doer.Queue;如有冲突,比如用到java.util.Queue,可以直接用
java.util.Queue q = ...
重名的话就写完整类名吧.!
你 import util.*了。这个就不好说了
bao110908能给我提供一些官方点的参考资料吗?
我好好学习一下!
多谢了!另外,楼上很多人觉得我有些“较真”?
其实这是需求使然,如果你在维护一个庞大的应用系统,
这个系统的一部分类既没有代码也没有设计书,
你如何把这些类从1.4执行环境移植到1.6环境,而保证不出现问题。
这个时候,可能就需要了解这方面的知识了。
import doer.*;
如此使用Queue则是定位到doer包中,如火龙果所说是在编译期确定的,1.6向下兼容,所以应该没问题
是官方文档记载的,还是通过实验得出的。
恕我愚钝,我目前看到的文档里面没有这方面的记载,
所以想请教大家,是否看到过相关的参考资料。
我所举的例子就是从项目中抽取出来的,
1.4开发当时使用了一个叫做Queue的类,这个类不幸被是现在1.6的java.util.Queue上了。
你让我把原来的类改名吗?
这个工作量不是改个名字这么简单的,
我的调查系统中用到这个类的地方,
再说说哦手里没有全部的source。另外,我觉得这个问题挺常见的,
应该通过调查弄明白