2011-11-23 98 views
1

我開發了一個庫,我需要該庫的用戶只能訪問一個類(使用幾種方法)。使庫的方法對於外部訪問不可見,但對庫可見

對於另一方面,我需要這個類可以訪問所有庫的方法類。

一個解決方案是將所有的類放在同一個包中,並使所有的方法受到保護,但我不喜歡爲不同的目的使用不同類的庫。 (就像一個類使用視頻和一個類來解析XML)。

現在:

com.aracem.library:
- 類1
- 等級2
- 類3
- 類4
- 5類

我想是這樣的

com.aracem.library:
- class 1
com.aracem.library.video
- 類2視頻
com.aracem.library.xml
- 類3 XML
- 類4的xml

如何可以定義CLAS 2的方法,3,4(在示例中)讓類1訪問方法,但不讓庫的用戶訪問該方法?

回答

8

由於java沒有任何訪問控制機制,除了訪問修飾符(私有,保護,公共或任何用於包保護訪問),我可以向您推薦以下解決方案。

所有的類都應該被封裝保護。爲了能夠從其他包中調用自己的類,請在包中創建公共接口並讓您的類實現這些接口。類的實例只能由工廠創建。每包裝出廠。工廠類本身是公共的。

現在,客戶端代碼只有一種可能性訪問您的類:使用您的工廠實例化它們。但工廠應該檢查來電者的訪問權限。很簡單:new Throwable().getStackTrace()[0]將返回調用者的堆棧跟蹤元素。檢查它的包裝並決定是否繼續或投擲Exception,例如SecurityException

還有其他解決方案。例如,您可以使用方面來包裝所有類。例如,使用AspectJ來執行字節碼修改並自動插入一些代碼。這段代碼將檢查訪問權限並拋出異常,如上所述。這個解決方案可能會更好,但需要您學習一些關於AspectJ的知識。

+0

你怎麼看待用其他類創建一個庫的想法(在這裏是xml和video),並且像.jar一樣包含它。這個想法也解決了這個問題,不是嗎? – Aracem

相關問題