如果我有一些類的某些接口受保護的類,那麼可以使用哪種模式,或者是什麼方式,但是我想在包之外使用它並且不使用層次結構?
我不想更改那些舊(傳統)類的訪問修飾符。通過模式訪問非公開的方法
0
A
回答
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)
。
0
比反射快,但同樣髒(或可能更多):在與舊類相同的包中定義一個類。給它所有你想要的公共方法。讓這些公共方法委派給遺留類的受保護方法。
我想我在打字後需要洗手。
+0
「我想我需要洗手後打字。「哈哈! –
相關問題
- 1. 通過引用訪問公開方法
- 2. 以編程方式訪問通過JMX公開的MessageHandlers
- 3. 在JUNIT中訪問非公開的對象方法
- 4. 無法從Lambda函數訪問非公開訪問的RDS/MYSQL
- 5. 從公開的方法訪問backgroundworker
- 6. 無法通過dll訪問公共方法
- 7. javascript私有成員無法通過公共方法訪問
- 8. 通過公共方法訪問私有成員變量
- 9. 通過公共方法訪問數據庫
- 10. 通過靜態和非靜態方法訪問靜態屬性?
- 11. 通過自定義servlet公開基於方解石的數據庫通過Avatica公開的方法
- 12. 使用非ActiveRecord模式,無法通過導軌控制檯訪問它
- 13. AS3無法訪問的方法 - 一切都明確公開
- 14. 通過擴展方法IDbSet和公開包含方法
- 15. 通過多模塊方式訪問mongodb/mongoskin的效率?
- 16. 通過平臺API訪問的公開照片
- 17. junit和java:測試非公開方法
- 18. 如何通過session.js訪問作爲Json公開的訪問者數據?
- 19. 單身人士訪問私人方法訪問公共方法
- 20. 模式遷移的非公有模式
- 21. 通過活動訪問片段方法
- 22. 通過方法訪問鏈表
- 23. 通過活動訪問服務方法
- 24. C#類:通過實例訪問方法
- 25. 訪問我的公開方法從我的命名空間
- 26. 通過程序訪問大規模excel文件與複雜的公式
- 27. 通過公共IP訪問計算機
- 28. BluetoothHeadset - 無法訪問公共方法
- 29. 無法訪問公共靜態方法
- 30. 已解決:::通過ip訪問https方式訪問,但不通過url
很好的答案,但可能要引用你的參考文獻... http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html – Bryan