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

时间:2014-06-18 09:27:53

标签: java compilation securityexception

说我正在以下列方式创建一个类LangTest.java

package java.lang;

public class LangTest 
{
    public static void show()
    {
        System.out.println("In langTest.show()");
    }
}

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

LangTest.show();

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

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)

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

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

5 个答案:

答案 0 :(得分:7)

  

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

可以在那里创建一个类。但出于安全考虑,正常情况下会出现这样的情况。 classloader不会让你加载它,它只接受来自JDK自己的核心jar文件。这是为了保护Java用户免于运行可能完全破坏其系统的恶意代码(例如破坏沙箱限制)。

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

  

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

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

答案 1 :(得分:1)

前缀“java”分别保留给核心Java包和Java扩展。

这就是为什么你不能声明你的包名称以java

开头

它由语言保留,因为这是核心Java内容已经存在的地方。实际上,java.lang包中的所有内容都默认在任何Java代码中隐式导入。

它包含“对Java编程语言设计至关重要的类”。 (来自文档)。由于用户定义的类根据定义不能对语言的设计至关重要,因此禁止将内容放在那里。允许用户将代码放在java.lang包中也是一个问题,因为这会将在那里定义的任何包域内容暴露给用户。

只需更改您的包裹名称(几乎任何其他内容),您就可以了。按照惯例,软件包名称通常是小写的,但您可以使它适合您的项目。有关更多内容,请参阅有关包的教程。

有关如何声明包的更多信息,请转到下面的链接

http://www3.ntu.edu.sg/home/ehchua/programming/java/J9c_PackageClasspath.html

答案 2 :(得分:1)

此SecurityException的原因是该包中的类能够公开具有包访问权限的属性,该访问权应限制为“对Java编程语言设计至关重要的类”(根据{{3 }})

答案 3 :(得分:0)

包java.util是sealed进行修改。向此包添加类的一种可能方法是编辑源代码编译您自己的java版本(例如OpenJDK)

答案 4 :(得分:0)

出于安全原因,java.lang是为java类保留的。编译错误是没有理由的,因为你的代码在语法上是正确的。