在一次采访中有人问我这个问题-“可以编写和加载自己的核心Java类版本(如String,Object等)”。我说不,但是面试官想知道Java为防止这种情况必须进行哪些检查。为了理解这一点,我在eclipse中编写了以下代码
package java.lang;
public final class String {
public static void main(String[] args) {
String s = new String();
}
}
我期望编译失败,因为Java在java.lang包中已经有一个String类。但是编译通过了,运行程序时出现以下错误-
Error: Main method not found in class java.lang.String, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
考虑到String已经存在于java.lang中以及Java如何阻止开发人员加载核心类,为什么编译成功了?
答案 0 :(得分:3)
javac
必须编译核心类。
在运行时进行了一些检查,以防止您加载重复的类。
您无法加载任何以java.
开头的类。我相信,这样做是为了阻止Microsoft做顽皮的不兼容的事情。
您不能在相同的类加载器实例中加载两个具有相同名称的类。
默认情况下,类加载器将在加载类之前检查父加载器。这是可覆盖的(具有相关的安全权限)。
您可以使用不同的核心类启动JVM,尽管这是特定于实现的。在JDK 8之前,您可以使用-Xbootclass/p:
选择性替换类。