是否可以编写和加载自己版本的核心Java类?
我在一次采访中被问到这个问题——“是否可以编写和加载自己版本的核心Java类(如字符串、对象等)”。我说没有,但面试官想知道Java有什么办法来防止这种情况。为了理解这一点,我在eclipse中编写了下面的代码是否可以编写和加载自己版本的核心Java类?,java,class,classloader,Java,Class,Classloader,我在一次采访中被问到这个问题——“是否可以编写和加载自己版本的核心Java类(如字符串、对象等)”。我说没有,但面试官想知道Java有什么办法来防止这种情况。为了理解这一点,我在eclipse中编写了下面的代码 package java.lang; public final class String { public static void main(String[] args) { String s = new String(); } } 我原以为编译会失败
package java.lang;
public final class String {
public static void main(String[] args) {
String s = new String();
}
}
我原以为编译会失败,因为Java.lang包中已经有一个String类。但是编译通过了,当我运行程序时,我得到了下面的错误--
考虑到java.lang中已经存在字符串,以及java如何阻止开发人员加载核心类,编译为何成功?
javac
必须编译核心类
在运行时会进行检查,以防止加载重复的类
- 您不能加载任何以
。我相信,这样做是为了阻止微软做淘气的不相容的事情java开头的类。
- 不能用同一个类装入器实例装入两个同名的类
- 默认情况下,类加载器将在加载类之前检查父加载器。这个是可重写的(具有相关的安全权限)
您可以使用不同的核心类启动JVM,尽管这是特定于实现的。在JDK 8之前,您可以使用
-Xbootclass/p:
选择性替换类。您可以编写自己的核心java类版本吗?通常是的,只要您不扩展最终类或做其他编译器不需要的事情。您能在核心java运行时环境中包含这些类吗?据我所知,没有。另外,当我将java.lang
指定为不在核心JRE中的文件中的包时,编译失败,您确定Eclipse配置正确吗?即使使用两个类加载器加载两个同名的类,运行时也不会混淆它们。请参阅JLS中的“加载约束”。
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