java - 是否可以编写和加载您自己版本的核心 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 如何阻止开发人员加载核心类,为什么编译会成功?
解决方案
javac
必须编译核心类。
在运行时进行检查以防止您加载重复的类。
您不能加载任何以
java.
. 我相信,这样做是为了阻止微软做顽皮的不兼容的事情。您不能使用相同的类加载器实例加载两个具有相同名称的类。
默认情况下,类加载器会在加载类之前检查父加载器。这个是可覆盖的(具有相关的安全权限)。
您可以使用不同的核心类启动 JVM,但这将是特定于实现的。在 JDK 8 之前,您可以使用-Xbootclass/p:
选择性替换类。
推荐阅读
- lua - 如何在lua中的某个字符上拆分字符串?
- github-pages - Dependabot 说 Kramdown 需要安全更新 - 但我没有一个 gemfile,其中的漏洞应该是
- sql - 您如何对使用单独查询生成的多个列进行求和?
- python - 使用模型推断批次与使用 pytorch 的个体时的不同结果
- sql-server - 当我尝试在函数中使用 if 时,关键字“if”附近的语法不正确
- python - 如何更新使用 python 从列表中随机提取的变量?
- c++ - 类的朋友不访问 CPP 中类的私有值
- angular - 如何递归显示不同的组件?
- php - phpMyAdmin 首页 - 将“服务器字符集”更改为 UTF-8
- swiftui - 如何使用 SwiftUI 获取电话联系人