Java では、実行時にリフレクションを使用してプライベート フィールドにアクセスしたり、リフレクションを使用してプライベート ネスト/内部クラスにアクセスしたりできます (たとえば、こちらを参照)。Java がこのようになっている理由を説明する特定の技術的理由、または一般的な設計哲学はありますか? わかりませんが、これを読むと、少なくとも一部の構成では、C#/.NET のように見えますが、同じことは不可能です。Javaにもその柔軟性がありますか? これが不可能な JVM 実装はありますか?
もちろん、Java がリフレクションを介したプライベート フィールドへのアクセスを許可していない場合でも、いつでも独自のランタイムを記述して、好きなことを行うことができます。または、バイナリ .jar/.class ファイルを変更して、アクセス修飾子を変更することもできます (これは可能だと思います)。
したがって、Java の設計者が選択しなければならなかった 3 つの可能性があるようです。
- プライベート フィールドへの直接アクセスを許可します...おそらく警告が表示されます。
- プライベート フィールドへの直接アクセスを許可しないでください。ただし、リフレクションを使用してプライベート フィールドへのアクセスを許可してください。
- プライベート フィールドへの直接アクセスを許可しないでください。また、リフレクションを使用したプライベート フィールドへのアクセスも許可しないでください。プライベート フィールドにアクセスする唯一の方法は、ランタイムを変更するか、バイナリの .jar/.class ファイルをオフラインで変更することです。
真ん中のものを選ぶのは恣意的に思えます...目標ができるだけ不便にすることである場合、選択肢3が最適です。とにかく真に防止できないものに人為的な不便を加えないことが目標である場合は、1 が最適です。
言語またはランタイムについて、選択肢 2 を選択する決定を通知または強制したものはありますか?