java的类区分大小写_Java类名称的区分大小写

Josh Sunshine

47

java

jvm

jls

如果在不同的目录中将两个具有相同的不区分大小写的公共Java类写入,那么这两个类在运行时都不可用.(我在Windows,Mac和Linux上使用多个版本的HotSpot JVM进行了测试.如果有其他JVM可以同时使用,我也不会感到惊讶.)例如,如果我创建一个名为class的类,a并且A如下所示:

// lowercase/src/testcase/a.java

package testcase;

public class a {

public static String myCase() {

return "lower";

}

}

// uppercase/src/testcase/A.java

package testcase;

public class A {

public static String myCase() {

return "upper";

}

}

我的网站上提供了三个包含上述代码的eclipse项目.

如果尝试我这样调用myCase这两个类:

System.out.println(A.myCase());

System.out.println(a.myCase());

类型检查成功,但是当我运行由上面的代码生成的类文件时,我得到:

线程"main"中的异常java.lang.NoClassDefFoundError:testcase/A(错误名称:testcase/a)

在Java中,名称通常区分大小写.某些文件系统(例如Windows)不区分大小写,因此上述行为发生时我并不感到惊讶,但似乎错了.不幸的是,Java规范对于哪些类是可见的是奇怪的非常规.在Java语言规范(JLS)的Java SE 7版(第6.6.1节,第166页)说:

如果一个类或接口类型被声明为public,那么任何代码都可以访问它,只要声明它的编译单元(第7.3节)是可观察的.

在7.3节中,JLS以极其模糊的术语定义了编译单元的可观察性:

预定义包java及其子包lang和io的所有编译单元始终是可观察的.对于所有其他包,主机系统确定哪些编译单元是可观察的.

在Java虚拟机规范同样是模糊的(第5.3.1节):

以下步骤用于加载,从而使用引导类加载器创建由[二进制名称] N表示的非阵列类或接口C [...]否则,Java虚拟机将参数N传递给方法的调用引导类加载器以依赖于平台的方式搜索C的声称表示.

所有这些都导致了四个问题,按重要性降序排列:

是否可以保证每个JVM中的默认类加载器可以加载哪些类?换句话说,我可以实现一个有效但退化的JVM,它不会加载除java.lang和java.io中的类之外的任何类吗?

如果有任何保证,上述示例中的行为是否违反了保证(即行为是否为错误)?

有没有什么办法,使热点负载a和A同步?编写自定义类加载器会起作用吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值