Zac*_*ack 5 java classloader platform-independent
我看到跨平台的差异关于Class.forName()何时抛出ClassNotFoundException以及何时抛出NoClassDefFoundError.这个行为在某个地方定义得很好,还是我偶然发现了一个错误?
请考虑以下代码(默认包中的独立java文件):
public class DLExceptionType {
private static void printFindError(String name) {
System.out.print(name + ": ");
try {
Class.forName(name);
System.out.println("** no error **");
} catch (Throwable e) {
System.out.println(e);
}
}
public static void main(String[] args) {
printFindError("DLExceptionType");
printFindError("dLExceptionType"); // note the mis-capitalization
}
}
Run Code Online (Sandbox Code Playgroud)
代码在Linux上生成预期输出:
[eos18:~]$ java -version DLExceptionType
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
[eos18:~]$ java DLExceptionType
DLExceptionType: ** no error **
dLExceptionType: java.lang.ClassNotFoundException: dLExceptionType
Run Code Online (Sandbox Code Playgroud)
它在Windows上生成一个不同但可理解的输出:
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) Client VM (build 21.1-b02, mixed mode, sharing)
Y:\Temp>java DLExceptionType
DLExceptionType: ** no error **
dLExceptionType: java.lang.NoClassDefFoundError: dLExceptionType (wrong name: DLExceptionType)
Run Code Online (Sandbox Code Playgroud)
Windows上的输出是有意义的:因为文件系统不区分大小写,所以JVM加载文件dLExceptionType.class,但该文件包含一个具有不同名称的类:DLExceptionType
但是,当我在Mac上运行代码时(具有区分大小写的文件系统和比Linux盒子更新的JVM),我获得与Windows相同的输出:
$ java -version
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-10M3527)
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)
$ java DLExceptionType
DLExceptionType: ** no error **
dLExceptionType: java.lang.NoClassDefFoundError: dLExceptionType (wrong name: DLExceptionType)
Run Code Online (Sandbox Code Playgroud)
HFS+(Mac 扩展)通常不区分大小写。自 Mac OS 10.3 起,Apple 引入了 HFSX,它可以区分大小写(但不是默认设置)。如果您没有在磁盘初始化时指定该选项,那么您的卷很可能不区分大小写。
请参阅: http: //en.wikipedia.org/wiki/HFS_Plus
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |