簡體   English   中英

通過模式訪問非公共方法

[英]Accessing non-public methods through patterns

如果我有一些可以保護某些接口的類,但是我想在包外和層次結構之外使用它,可以使用哪種模式,或采用哪種方式?
我不想更改那些舊(舊)類的訪問修飾符。

以下代碼顯示了如何訪問此類字段:

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

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

同樣的事情也可以用一種方法來完成。 但是,作為一種模式,最好將其打包在靜態實用程序方法中,例如ReflectionAccessor.accessField(Class class, Object object, String fieldName)

如果您需要訪問的部分類protected ,則可以通過繼承進行訪問。
您還可以通過那些確實可以訪問受保護代碼的類來訪問受保護的部件。

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

但是,在所有這些之前,請仔細考慮為什么界面的這些部分沒有公共作用域。 可能有充分的理由不公開它們。

受保護方法的全部目的是使它無法從外部訪問,而使受保護方法通常是設計模式的重要方面。

您想破壞類的封裝,並且沒有設計模式可以幫助您做到這一點。 僅臟反射調用。

您可以使用類適配器。 類適配器將從繼承類繼承而來,並公開公共接口方法,這些方法將在內部調用您的受保護方法。 您的客戶端將調用類適配器的公共方法,該方法將在內部調用您的舊類。

比反射更快,但同樣骯臟(或可能更骯臟):在與舊類相同的程序包中定義一個類。 為其提供所需的所有公共方法。 讓這些公共方法委托給遺留類的受保護方法。

我想輸入后需要洗手。

暫無
暫無

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

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