Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以编写和加载自己版本的核心Java类?_Java_Class_Classloader - Fatal编程技术网

是否可以编写和加载自己版本的核心Java类?

是否可以编写和加载自己版本的核心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(); } } 我原以为编译会失败

我在一次采访中被问到这个问题——“是否可以编写和加载自己版本的核心Java类(如字符串、对象等)”。我说没有,但面试官想知道Java有什么办法来防止这种情况。为了理解这一点,我在eclipse中编写了下面的代码

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