说我正在以下列方式创建一个类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或类似的类中创建一个类?此外,为什么在这种情况下没有给出编译错误?
答案 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类保留的。编译错误是没有理由的,因为你的代码在语法上是正确的。