为什么你不能在java.lang中创建类?

Ply*_*ock 3 java securityexception compilation

假设我LangTest.java以下列方式创建一个类:

package java.lang;

public class LangTest 
{
    public static void show()
    {
        System.out.println("In langTest.show()");
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个类中,我甚至将该方法称为:

LangTest.show();
Run Code Online (Sandbox Code Playgroud)

他们都没有给出任何编译问题,但在运行时它会抛出异常. -

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang
    at java.lang.ClassLoader.preDefineClass(ClassLoader.java:479)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:614)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    at com.javatpoint.Test.main(Test.java:28)
Run Code Online (Sandbox Code Playgroud)

只要您创建以" java." 开头的包名称,就会发生这种情况.

我的问题是为什么我们不允许在java.lang或类似的东西中创建一个类?而且,为什么在这种情况下没有给出编译错误?

Thi*_*ilo 7

我的问题是为什么我们不允许在java.lang或类似的东西中创建一个类?

可以在那里创建一个类.但出于安全原因,"普通"类加载器不允许您加载它,它只接受来自JDK自己的核心jar文件.这是为了保护Java用户免于运行可能完全破坏其系统的恶意代码(例如破坏沙箱限制).

如果要实现自己的java.*类版本,则必须实现自己的JDK(或者至少创建自己的runtime.jar版本).

而且,为什么在这种情况下没有给出编译错误?

那么,JDK标准库也需要由相同的Java编译器编译......