簡體   English   中英

為什么你不能在java.lang中創建類?

[英]Why you can not create class in java.lang?

假設我以下列方式創建一個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或類似的東西中創建一個類? 而且,為什么在這種情況下沒有給出編譯錯誤?

我的問題是為什么我們不允許在java.lang或類似的東西中創建一個類?

可以在那里創建一個類。 但出於安全原因,“普通”類加載器不允許您加載它,它只接受來自JDK自己的核心jar文件。 這是為了保護Java用戶免於運行可能完全破壞其系統的惡意代碼(例如破壞沙盒限制)。

如果要實現自己的java.*類版本,則必須實現自己的JDK(或者至少創建自己的runtime.jar版本)。

而且,為什么在這種情況下沒有給出編譯錯誤?

那么,JDK標准庫也需要由相同的Java編譯器編譯......

前綴“ java ”分別保留用於核心Java包和Java擴展。

這就是為什么你不能聲明你的包名稱以java開頭

它由語言保留,因為這是核心Java內容已經存在的地方。 事實上,java.lang包中的所有內容都默認在任何Java代碼中隱式導入。

它包含“對Java編程語言設計至關重要的類”。 (來自文檔)。 由於用戶定義的類根據定義不能對語言的設計至關重要,因此禁止將內容放在那里。 允許用戶將代碼放在java.lang包中也是一個問題,因為這會將在那里定義的任何包域內容暴露給用戶。

只需更改您的包裹名稱(幾乎任何其他內容),您就可以開始了。 按照慣例,軟件包名稱通常是小寫的,但您可以使它適合您的項目。 有關更多信息,請參閱軟件包教程。

有關如何聲明包的更多信息,請轉到下面的鏈接

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

此SecurityException的原因是該包中的類能夠公開具有包訪問權限的屬性,該訪問權應限制為“對Java編程語言設計至關重要的類”(根據http:// docs。 oracle.com/javase/6/docs/api/java/lang/package-summary.html

包java.util被sealed以進行修改。 向此包添加類的一種可能方法是編輯源代碼編譯自己的java版本(例如OpenJDK)

出於安全原因,java.lang是為java類保留的。 編譯錯誤是沒有理由的,因為您的代碼在語法上是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM