2

一部のフィールドとメソッドがプライベートであるサードパーティのデータモデルクラスがあります。このクラスをハックして、これらのプライベート フィールドをラップして外部からアクセスできるようにしたいと考えています。

たとえば、データ モデルは defaultModel.java です。これを拡張して、Java リフレクションを使用してプライベート フィールドをラップするサブクラス RefineddefaultModel.java を作成します。

これを行う良い設計パターンはありますか?

どうにかしてそれを反映するのは私のサブクラスだけだと感じたので、それはベストプラクティスではありません。

4

1 に答える 1

3

これを行う良い設計パターンはありますか?

いいえ!プライベート フィールドをいじるのは諸悪の根源なので、良い方法はありません。クラスの不変条件と並行性のサポートに違反する可能性があり (そしておそらく違反する可能性が高く)、将来のバージョンとの非互換性を危険にさらし、実行時に多くの予期しない動作が発生することになります。必要があるという事実は、設計またはライブラリの使用方法に重大な問題があることを示しています。


あなたが尋ねた場合:それは恐ろしい方法で可能ですか?答えはイエスです。このようなことができます。

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

完全に手に負えなくなりたくない場合は、gets のみを実行し、sets は実行しないでください。オブジェクトを拡張したり、クラス構造をいじったりすることはさらに避けたいと思います。これには、コンポジションを使用してアダプターパターンを使用できます。

いずれかのフィールドが final である場合、追加の問題が発生する可能性があります。この既存の質問を参照してください: リフレクションによるプライベート最終フィールドの変更Java でプライベート フィールドを読み取るにはどうすればよいですか?も参照してください。

しかし、私はこれを強調しなければなりません:これを避けて、あなたの将来の自分を幸せにするために一生懸命努力してください.:)

于 2013-10-16T12:43:09.487 に答える