2017-07-14 1 views
-2

Reflection APIの導入により、私たちは自由にプライベートフィールドに自由にアクセスできます。例えばプライベート、パブリック、保護された修飾子は、Javaでは依然として必須ですか?

:だから今

Field f = obj.getClass().getDeclaredField("stuffIWant"); 

、私たちは、すべての修飾子を排除し、直接が、ゲッター/セッターを経由してフィールドにアクセスしないようにJava開発者のための共通ルールを設定した場合は?明らかにルールに違反する可能性がありますが、モディファイアがあってもモディファイアを使わずにアクセスできます。

+1

「今」とは「基本的に永遠に」という意味ですか?なぜあなたは抽象的/カプセル化を捨てたいのですか?反射は強力なツールですが、めったに使用しないでください。アクセス修飾子は、99.9%のケースで私たちの生活をより生産的に(そして危険性を低く)します。 –

+0

あなたが何かをすることができたからといって、あなたが意味するものではありません。 APIデザイナーは、理由のために行った修飾子を追加することをおそらく決定しました。 – NilsH

+7

また、「車はスピード制限を超えることができます。なぜスピード制限があるのですか?合法的にすべての人が法律で許可されるべきではありません。 –

答えて

2

間違った考え方。

あなたはオーバーライド、実行時に特定の保護レベルは、あなたが急になったり、今悪いソースコードを書くことが許可されていることを意味しないことができるという事実

(または将来的に)。

実行時にこれらのキーワードを使用して保証を設定することはありません。これは望ましい副作用ですが、実際のこれらのキーワードのポイントではありません。あなたは主にの意図を表現するためにそれらを使用します!人間の読者のためにソースコードを理解しやすくする。それは何もありませんあなたはリフレクションを使用して実行時に行うことができます。

javacコンパイラは、ソースコードをバイトコードに変換します。 JVMジャストインタイムコンパイラはある時点でJavaバイトコードをマシンコードに変換します。あなたのロジックに従うときは、Javaでプログラムを書くのをやめて、マシンコードを直接書くべきですか?とにかく、実行時にマシンコードだけが存在するため、あなたは知っていますか? (私は最高の比較ではなく、ランタイム機能がソースコードの内容と何の関係もないという事実を強調することを目的としています)。その向こう

セキュリティマネージャその周りこの保護を無効にするからできないことがありますまだそこにあります。

反射を使用することは、非常に特定のコーナーケースでのみ行う必要があることをご理解ください。リフレクションはパフォーマンスのキラーです。それは非常に扱いにくく、また非常にエラーを起こしやすい。それはあなたがなし他の選択を持っているときにだけを使用するJavaのこれらの機能の一つです。あなたが「毎日の仕事」のために選ぶ「普通の」ツールのセットではではなく、です。

最後に、Java 9が導入したモジュールのコンセプトは、もはやモジュール内の何にでもアクセスすることを許可しなくなりました。公開された公開された要素だけがアクセス可能です。それは反射にも当てはまります。もう少し複雑で、動作を変更するコマンドラインスイッチもありますが、どこにでも簡単にアクセスできる時間は基本的には番号が付けられています。

0

Reflection APIの導入により、任意のプライベートフィールドに自由にアクセスできます。

反射があるからといって、アクセス権があるわけではありません。

できません。 Security Manager (with defined secure policy)なしでコードを配布しない限り、安全でない/遅い操作を行うことができます。しかし、あなたはまだそうするように彼らを止めることができます。

セキュリティマネージャは、アプリケーションがセキュリティポリシーを実装できるようにするクラスです。これにより、アプリケーションは、おそらく安全でないか敏感な操作を実行する前に、操作が何であるか、および操作が実行されることを可能にするセキュリティコンテキストで試行されているかどうかを判断することができます。アプリケーションは、操作を許可または禁止できます。

アクセス許可は、ファイル、ソケット、ネット、セキュリティ、ランタイム、プロパティ、AWT、、リフレクション、およびシリアライズのカテゴリに分類されます。これらのさまざまなアクセス権カテゴリを管理するクラスは、java.io.FilePermission、java.net.SocketPermission、java.net.NetPermission、java.security.SecurityPermission、java.lang.RuntimePermission、java.util.PropertyPermission、java.awt.AWTPermission、 java.lang.reflect.ReflectPermission、およびjava.io.SerializablePermissionです。

関連する問題