首頁 >Java >java教程 >Java 9 中的非法反射存取是什麼以及它是如何表現的?

Java 9 中的非法反射存取是什麼以及它是如何表現的?

Patricia Arquette
Patricia Arquette原創
2024-12-05 15:12:10299瀏覽

What is Illegal Reflective Access in Java 9 and How Does It Manifest?

非法反射存取

在Java 9 中,非法反射存取是指以違反增強封裝原則的方式使用反射API 的情況由模組系統引入。當一個模組中的程式碼在未經適當授權的情況下嘗試存取另一模組中類別的私有或受保護成員時,可能會發生這種情況。

非法反射存取的定義

非法反射存取被定義為任何反射操作:

  • 訪問另一個類別中的私有或受保護成員module
  • 呼叫另一個模組中類別的私有方法
  • 修改另一個模組中類別的final字段
  • 創建不公開可見的類別的實例在另一個模組

觸發情況

在以下情況下會觸發非法反射存取:

  • 一個模組中的類別使用反射來存取另一個模組中未明確呼叫的類別的私有或受保護成員透過模組聲明或VM 參數暴露給第一個模組。
  • 一個模組中的類別使用反射來呼叫該模組中類別的私有方法未明確暴露給第一個模組的另一個模組。
  • 一個模組中的類別使用反射來修改未明確暴露給第一個模組的另一個模組中的類別的最終欄位。
  • 一個模組中的類別使用反射來創建在另一個模組中不公開可見的類別的實例。

模組系統和寬鬆封裝

Java 9 引入了寬鬆強封裝規則,允許某些有限形式的反射存取。具體來說,它允許模組的運行時系統打開模組中的包以在未命名模組中進行編碼(即類路徑上的代碼)。如果使用此選項呼叫運行時系統,並且成功地使用反射,否則會失敗,則發生「非法」反射存取。

警告訊息

發生非法反射存取時,會發出以下格式的警告訊息:

警告:非法反射$PERPETRATOR 存取$VICTIM

,其中:

  • $PERPETRATOR是包含呼叫反射操作的程式碼的類型的完全限定名稱,加上程式碼來源(JAR檔案路徑)(如果可用)。
  • $VICTIM 描述正在存取的成員,包括封閉的完全限定名稱類型。

以上是Java 9 中的非法反射存取是什麼以及它是如何表現的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn