2011-12-13 32 views
0

如果我有一些類的某些接口受保護的類,那麼可以使用哪種模式,或者是什麼方式,但是我想在包之外使用它並且不使用層次結構?
我不想更改那些舊(傳統)類的訪問修飾符。通過模式訪問非公開的方法

回答

0

您可以使用一個類適配器。類適配器將從Legacy類派生並公開接口方法,這些方法將在內部調用您的受保護方法。您的客戶端將調用將在內部調用您的遺留類的類適配器的公共方法。

1

如果您需要訪問的部分類是protected,則可以通過繼承來訪問它。
您也可以通過訪問受保護代碼的那些類訪問受保護部件。

可能使用的設計模式是Proxy。 在這種情況下,代理可以從您感興趣的類繼承,並使您感興趣的方法在本地可用。

然而,在這之前,請仔細考慮爲什麼這些接口的這些部分沒有公共範圍。可能有很好的理由不暴露他們。

0

受保護方法的重點在於使其無法從外部訪問,並且保護方法通常是設計模式的一些重要點。

你想打破封裝的類,並沒有設計模式,將幫助你做到這一點。只有髒反射電話。

2

下面的代碼演示瞭如何訪問這樣一個領域:

Field privateStringField = PrivateObject.class. 
     getDeclaredField("privateString"); 

privateStringField.setAccessible(true); 
String fieldValue = (String) privateStringField.get(privateObject); 

同樣的事情可能的方法來進行爲好。但作爲一種模式,你最好用一種靜態的實用方法來包裝它,比如ReflectionAccessor.accessField(Class class, Object object, String fieldName)

+1

很好的答案,但可能要引用你的參考文獻... http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html – Bryan

0

比反射快,但同樣髒(或可能更多):在與舊類相同的包中定義一個類。給它所有你想要的公共方法。讓這些公共方法委派給遺留類的受保護方法。

我想我在打字後需要洗手。

+0

「我想我需要洗手後打字。「哈哈! –

相關問題