リフレクションはカプセル化の原則を破ります。カプセル化の原則が反射から壊れていることを保護できますか? カプセル化を反射から保護できる API はありますか?
2 に答える
技術的には、はい。SO をすばやく検索すると、リフレクションを防止する例が見つかります: https://stackoverflow.com/a/770672/2372767。といっても、
反射はカプセル化の原則を破ります...
原理の誤解を意味します。カプセル化のポイントは、悪意のある他のコードからコードを保護したり、実装を保護したり、ある程度のセキュリティを作成したりすることではありません。
パブリック メソッドとプライベート メソッドを使用してインターフェイス (クラス、モジュール、オブジェクトなど) を作成すると、実際には、使いやすいインターフェイスとそうでないインターフェイスの 2 つのインターフェイスを作成することになります。基本的に、何かを非公開にする場合、実際に言っているのは、「これは、何かを成し遂げるための厄介で複雑な詳細の一部であり、これを直接呼び出すのは危険かもしれない」ということです。
ここで強調したいのは、プライベート インターフェイスもインターフェイスであり、パブリック メソッドと同じように扱う必要があるということです。他のプログラマーにプライベート メンバーを使用するように勧めるべきではありませんが、他の誰かがこれらの厄介で複雑な手順をいつ使用する必要があるかはわかりません。
他のユーザーが言及したように、プライベート クラス メンバーを取得する方法は他にもあります。リフレクションは、同じタスクを実行するための使いやすい API です。
カプセル化の多くの定義のA language mechanism for restricting access to some of the object's components.
中で、このメカニズムはアプリケーションの設計時に使用されます。とにかく、アプリケーションを保護することは決してタスクではありませんでした。したがって、この概念を安全なメカニズムとして使用することはできず、リフレクションがそれを妨げると主張することはできません。カプセル化されていないものを残すことで反射を止めることができるのは、開発者だけです。