簡體   English   中英

我的模塊化庫的用戶是否可以通過任何方式訪問尚未導出的類?

[英]Is there any way that users of my modular library are able to access classes which have not been exported?

我正在嘗試熟悉Java 9中引入的模塊系統,我想知道利用它的最佳方法。

對於我正在編寫的庫,我想執行以下操作(忽略軟件包的命名):

  • 通過com.myproject.api僅公開接口,簡單的POJO類和工廠類。 用戶可以使用此類中的所有內容。
  • 將接口的實現放入com.myproject.core 用戶應該無法在此處訪問任何內容。

我的理由是,用戶無需對實現邏輯感到困惑或不知所措。 取而代之的是,他們可以僅查看(希望)干凈且記錄良好的界面。

但是,由於Java程序包的工作方式,很難在不將所有程序包都私有的情況下限制某些類的使用。 但是我不喜歡將所有類都放在一個包中,而是希望將它們組織成各種包。

在閱讀了有關模塊系統的知識之后,我相信我可以做以下事情來實現我想要的。 這是module-info.java文件:

module com.myproject {
    exports com.myproject.api;
}  

據我了解,我的庫用戶將能夠使用com.myproject.api包中定義的所有內容(通過在自己的module-info文件中使用require com.mypojrect.api )。

但是,用戶是否可以通過任何方式訪問com.myproject.core軟件包中的任何內容? 我對他們(通過IDE或源代碼本身)查看代碼沒有問題,但是我只是不想最終支持我不想公開的類/方法/邏輯。

我擔心沒有模塊化應用程序的用戶或將我的庫JAR放在類路徑中的用戶將以某種方式找到一種方法來訪問假定的受限軟件包。

如果您需要其他任何信息,請告訴我。

庫的JDK9用戶不存在,因為您將使用JDK8Java平台模塊系統 ,因此您將編譯為大於52的類版本。

話雖如此,您的用戶將能夠查看源代碼(如果已發貨),並且顯然他們將能夠提取您的.class文件。


根據定義

除非是公共類型並且您導出其包,否則其他模塊將無法訪問模塊中的類型。

獲得對您的課程的反思訪問的唯一方法是,如果您願意通過以下方式打開它們:

opens your.package

指示。 因此,基本上,您還將了解Reflection方面的內容。
opens指令僅向Reflection公開公共定義。


如果要在非模塊化/ JDK9環境中控制類的反射訪問,則可能需要SecurityManager 但是,這需要訪問JVM配置。

暫無
暫無

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

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