当前位置: 首页 > 知识库问答 >
问题:

Java案例敏感性:类文件冲突:资源存在不同的案例

濮阳唯
2023-03-14

我在Windows操作系统,在eclipse IDE工作,我有以下两个场景:

1.我创建了以下类,这是在Employee中。java类(E为大写):

public class Employee {
    public static void main(String[] args) {
        employee emp = new employee();
        emp.test();
    }
}

//here e is in lowercase
class employee {
    public void test() {
        System.out.println("I am in test()");
    }
}

在这种情况下,我得到了以下例外:

Exception in thread "main" java.lang.NoClassDefFoundError: employee (wrong name: Employee)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
.
.
.
at Employee.main(Employee.java:4) // i.e at emp.test();

2.我创建了以下类,这是Employee。java类:

public class Employee {
    public static void main(String[] args) {

    }
}

现在,当我试图在同一个包中创建employee.java(e是小写)类时,我在eclipse中得到了一条消息,即Type具有相同的名称,但存在不同的大小写。

我的问题是:Java是区分大小写的。这是指JVM(基于windows和UNIX)区分大小写还是编译器区分大小写?为什么它在场景1中给出了这个异常,而eclipse不允许我创建employee。场景2中相同位置的java文件。

还记得我在Windows操作系统上,它对文件名不区分大小写,所以我知道它不允许使用employee。java和Employee。java在同一位置。这是否违反了Java的区分大小写原则?

共有3个答案

刘英彦
2023-03-14

无论如何,按照惯例,类名应该总是以大写开头。

此约定有助于避免您描述的问题。

韦安怡
2023-03-14

Windows上的文件系统不区分大小写:Employee.class和employee.class不能位于同一目录中。

场景1,两个类都在同一个java源中定义:编译器创建employee。阶级可能会使雇员过于自负。阶级或别的什么。

使用单独java源代码的场景2:Eclipse将无法创建员工。java与Employee位于同一目录中。java(在Windows文件系统下)。因此,过去有人会小心地以用户友好的方式处理错误。

Java假定区分大小写的名称。

你可以把你的源代码带到Linux,编译成一个新的版本。jar(一种zip格式,同样区分大小写)。然后将jar复制到windows并执行它。

顺便说一下,我认为您已经找到了一种混淆java源代码的新方法,即在Windows下进行反编译。

相关主题是在类/文件名中使用Unicode字母。这涉及到不同的平台、Unicode的不同规范表示(作为一个或两个Unicode代码点)、版本控制系统。

精化:(针对感兴趣的人)

人类字符é在Unicode中有两种表示形式:

  • “\u00E9”-作为一个代码点u00E9,é
  • “e\u0301”-作为两个代码点,U 009B,字母e,加上组合变音符号U-0301,'(零宽度重音)

不幸的是,不同的操作系统(我被告知)使用不同的规范表示。我曾经想使用版本控制系统hg,但不得不找出,他们缺少对Linux /Windows互操作性的支持。

否则,可以使用java规范化为规范形式。文本规格化器

让我们等待:

class CaféMañanaFaçade
乐正远
2023-03-14

这不是Java的限制,而是您试图编写文件的Windows文件系统的限制。在不区分大小写的文件系统上,编译器不能同时写入Employee。分类员工。类到磁盘,因为就FS而言,它们是同一个文件。

如果您可以以某种方式编译到区分大小写的文件系统(例如在Linux),然后将结果类文件打包到JAR中,那么您就可以在Windows上以ZIP文件的形式运行该JAR而不会出错能够包含两个名称只有大小写不同的不同条目。

 类似资料:
  • 我们需要从外部系统获取数据,并将其存储在Redis缓存中,然后使用Spring Cacheable annotation检索数据。问题是客户希望数据区分大小写。是否可以使用redis或在redis中进行任何配置来实现这一点。

  • 已迁移至 官方的 awesome mobx

  • 我对不同类型的标识符案例以及人们对它们的称呼感兴趣。你知道这个名单上还有其他名字吗? :骆驼大小写(例如在java变量名中) :大写的骆驼大小写(例如在java类名中) :Snake大小写(例如在python变量名中) : Kebab大小写(例如球拍名称) :平面大小写(例如在java包名称) :大写(例如C常量名称)

  • 如果在不同的目录中写入两个具有相同不区分大小写名称的公共Java类,那么这两个类在运行时都不可用。(我在Windows、Mac和Linux上测试了HotSpot JVM的几个版本。如果有其他JVM可以同时使用,我不会感到惊讶。(例如,如果我创建一个名为的类和一个名为的类,如下所示: 我的网站上提供了三个包含上述代码的eclipse项目。 如果尝试我调用在两个类上像这样: typechecker成功

  • 本文向大家介绍Scala案例分类和不可变性,包括了Scala案例分类和不可变性的使用技巧和注意事项,需要的朋友参考一下 示例 Scala编译器默认在参数列表中为每个参数加上前缀val。这意味着,默认情况下,案例类是不可变的。每个参数都具有一个访问器方法,但是没有可变器方法。例如: 在案例类中将参数声明为var会覆盖默认行为,并使案例类可变: 案例类为“可变”的另一个实例是案例类中的值是可变的: 请

  • 问题内容: 在理解Java JDBC ResultSet Types时,有两种滚动类型TYPE_SCROLL_SENSITIVE和TYPE_SCROLL_INSENSITIVE,我知道。但是当我进行实际实施时,我没有看到效果。下面是代码: 当程序到达LINE 39时,我从后端更新了数据库以进行记录。对于TYPE_SCROLL_INSENSITIVE,它不显示应执行的更新记录,但对于TYPE_SCR