我在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 with same name but different case exists.
我的问题是:Java区分大小写。这是否意味着JVM(基于Windows和UNIX)区分大小写或编译器区分大小写?为什么它在场景1和eclipse中给出了异常,这使我无法在场景2中的相同位置创建employee.java文件。
还记得我在Windows操作系统上对文件名不区分大小写,所以我知道它不允许在同一位置使用employee.java和Employee.java。 这是否违反了Java区分大小写?
答案 0 :(得分:2)
Windows上的文件系统不区分大小写:Employee.class和employee.class不能驻留在同一目录中。
场景1,在同一个java源中定义了两个类: 创建employee.class的编译器可能会过分使用Employee.class或其他任何内容。
具有单独Java源的场景2: Eclipse无法在Employee.java(在Windows文件系统下)的同一目录中创建employee.java。因此,过去有人负责处理用户友好的错误。
Java假定区分大小写的名称。
您可以将您的资源转换为Linux,将它们编译为.jar(zip格式,同样区分大小写)。然后将jar复制到windows并执行它。
顺便说一下,我认为你找到了一种新的方法来混淆java源代码,在Windows下进行反编译。
相关主题是在类/文件名中使用Unicode字母。它涉及不同的平台,Unicode的不同规范表示(é
作为一个或两个Unicode代码点),版本控制系统。
详细说明: (感兴趣的)
人物角色é
在Unicode中有两个表示形式:
é
; e
,再加上变音符号U-0301,´
(零宽度重音)。不幸的是,不同的操作系统(我被告知)使用不同的规范表示。 我曾经想使用版本控制系统 hg ,但必须找出他们缺少对Linux / Windows互操作性的支持。
否则,可以使用java.text.Normalizer
将规范化规范化为规范形式。
所以让我们等待:
class CaféMañanaFaçade
答案 1 :(得分:1)
这不是Java的限制,而是您尝试编写文件的Windows文件系统的限制。在不区分大小写的文件系统上,编译器无法将Employee.class
和employee.class
写入磁盘,因为就FS而言,它们是同一个文件。
如果您可以以某种方式编译到区分大小写的文件系统(例如在Linux上),然后将生成的类文件打包到JAR中,那么您将能够在Windows上从该JAR运行而不会出现错误,如ZIP文件 能够包含两个不同的条目,其名称仅在大小写上有所不同。
答案 2 :(得分:0)
无论如何,按照惯例,类名应始终以大写字母开头。
此约定有助于避免您所描述的问题。
答案 3 :(得分:0)
不,它没有; Java区分大小写,并且所有Java都可以控制自身。
它无法控制您的文件系统,其实现可能不遵守Java策略。
答案 4 :(得分:0)
我在gradle项目中遇到了这个问题,该项目包含多个子项目,来源不同。他们中的一个有一个读com.package.level1.Main
的类,另一个有com.package.level1.main.Util
。当我为整个项目运行gradle build时,它在命令行中运行良好,但是Eclipse项目上的红色惊叹号很难解决。消除此问题的方法是删除该项目的源文件的自动Java编译,并设置为仅使用gradle。情况如下:
Project Properties
。Builders
。Java Builder
,仅保留Gradle Project Builder
。