首页 > 解决方案 > 是否可以编写和加载您自己版本的核心 Java 类?

问题描述

我在一次采访中被问到这个问题——“是否可以编写和加载你自己版本的核心 Java 类(如字符串、对象等)”。我说不,但面试官想知道 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

考虑到 java.lang 中已经存在 String 以及 Java 如何阻止开发人员加载核心类,为什么编译会成功?

标签: javaclassclassloader

解决方案


javac必须编译核心类。

在运行时进行检查以防止您加载重复的类。

  • 您不能加载任何以java.. 我相信,这样做是为了阻止微软做顽皮的不兼容的事情。

  • 您不能使用相同的类加载器实例加载两个具有相同名称的类。

  • 默认情况下,类加载器会在加载类之前检查父加载器。这个是可覆盖的(具有相关的安全权限)。

您可以使用不同的核心类启动 JVM,但这将是特定于实现的。在 JDK 8 之前,您可以使用-Xbootclass/p:选择性替换类。


推荐阅读