【问题标题】:Is to possible to write and load your own version of core Java classes?是否可以编写和加载您自己版本的核心 Java 类?
【发布时间】:2019-11-21 02:13:58
【问题描述】:

我在一次采访中被问到这个问题——“是否可以编写和加载您自己版本的核心 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 如何阻止开发人员加载核心类,为什么编译成功?

【问题讨论】:

  • 你能写你自己版本的核心 java 类吗? 通常可以,只要你不扩展最终类或做其他编译器禁止的事情. 您能否在核心 java 运行时环境中包含这些类? 我不知道,不。此外,当我将 java.lang 指定为不在核心 JRE 中的文件中的包时,编译失败,您确定您的 Eclipse 配置正确吗?

标签: java class classloader


【解决方案1】:

javac 必须编译核心类。

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

  • 您无法加载任何以java. 开头的类。我相信,这样做是为了阻止微软做不兼容的事情。

  • 你不能用同一个类加载器实例加载两个同名的类。

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

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

【讨论】:

  • 即使你使用两个类加载器来加载两个同名的类,运行时也不会混淆它们。请参阅 JLS 中的“加载约束”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2017-07-14
  • 2021-08-02
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多