2009-04-20 11 views
2

Javaでインターフェイスを実装する場合、呼び出し元が指定した具体的な実装を見たり、そのクラスにキャストしたり、インターフェイスにないメソッドを呼び出したりすることはありません。私はこれが "悪意のあるダウンキャスティング"と信じています。「悪意のあるダウンキャスト」を防ぐラッパーの自動生成?

これを防ぐには、インターフェイスのメソッドのみを持つラッパーを作成し、それがデリゲートする実装インスタンスを公開しないようにします。あなたが安全でなければならない私的な変数への反映の欠如。

これらの種類のラッパーを自動的に作成する方法はありますか(IDEでコード作成ウィザードを使用しないで、実行時に、それでもソースファイルを作成する必要があります)。

+1

編集者Chris Jester-Youngに感謝します。コメントをアップアップすることができるようになりましたので、私は編集をupvoteしたいと思います... – Thilo

+0

あなたの賛辞をありがとう!とても有難い。 –

答えて

8

これを防ぐもう1つの方法は、ファクトリクラスを使用し、実装をファクトリのプライベート内部クラスにすることです。ファクトリだけがそれを見ることができ、インタフェース型だけを返すので、キャストする具体的な実装はありません。

+0

私は同じ行に沿って、具体的な実装のためにパッケージ保護されたクラスを使用することもできます。 – Thilo

+1

パッケージ保護されたクラスの問題は、誰かがあなたのパッケージに追加して何が起こっているのを見られないようにするのでしょうか? –

+0

@James:それはカスタムクラスローダーを使用する許可を必要とするでしょうか?また、もしあなたのSecurityManagerが_that_を禁止していなければ、あなたはすでに失われています。 –

7

私はJames Blackの答えが似ていますが、多様性のために、別の方法を紹介します。

これを行うにはjava.lang.reflect.Proxyを使用できます。 Proxyを使用するコードについては、this postを参照してください。あなたは同期のものを取り除く場合、同様のコードを使用することができます。

関連する問題