2013-10-14 33 views
1

我有第三方數據模型類,其中一些字段和方法是私有的。我想破解這個類來包裝這些私人領域,以便可以從外部訪問。使用反射破解類字段的任何設計模式

例如,數據模型是defaultModel.java。我想擴展它來創建一個子類RefineddefaultModel.java,它使用Java反射來封裝它的私有字段。

有沒有什麼好的設計模式可以做到這一點?

因爲我覺得只有在我的子類中反映它不知何故,這不是最佳實踐。

+13

如果您使用反射修改私有字段,那麼您已經處於「不是最佳實踐」IMO的領域。 –

+2

我同意Jon Skeet的觀點,如果這個類沒有被覆蓋,或者隱藏了一些子類的數據,那麼最好的做法是不要破解這個類。除此之外,還有很多情況可能會破壞你的代碼,例如SecurityManagers不允許訪問這些字段,未來版本的基類會發生變化等。 – Thomas

+0

也許你可以詳細說明你的實際目標是什麼。我確信在你的具體情況下會有更好的設計選擇。 – Thomas

回答

2

有沒有什麼好的設計模式可以做到這一點?

不!私人領域是所有邪惡的根源,所以沒有的方式。你可能(也很可能會)違反類不變和併發支持,冒着與未來版本不兼容的風險,最終會在運行時產生許多意想不到的行爲。您需要的事實是一個跡象,表明您的設計或使用庫的方式存在嚴重問題。


如果你問:它可能以一種可怕的方式嗎?答案是肯定的。你可以做這樣的事情。

// Possible but horrible: 
Field field = object.getClass().getDeclaredField("privateField"); 
field.setAccessible(true); 
oldValue = field.get(object); 
field.set(object, newValue); 

如果你想讓東西不能完全失控,只能得到,永遠不要做集。我會進一步避免擴展對象並搞亂類結構。您可以使用適配器模式使用合成爲此。

如果任何字段是最終的,您可能會遇到其他問題。看到這個存在的問題: Changing private final fields via reflection。您也可以看到How do I read a private field in Java?

但我必須強調這一點:儘量避免這種情況,讓您的未來自我開心。 :)