これらのキーワードによって引き起こされるコンパイラエラーがバグから私を救ったような状況にはありませんでした。
ライブラリの作成者が実装のどの部分を保守するかを決定できるようにするため、アプリケーションの作成者をバグから救うことはそれほど重要ではありません。
図書館がある場合
class C {
public void foo() { ... }
private void fooHelper() { /* lots of complex code */ }
}
foo
の実装を置き換え、場合によってfooHelper
は根本的な方法で変更できるようにしたい場合があります。fooHelper
私のドキュメントのすべての警告にもかかわらず多くの人々が使用することに決めた場合、私はそれをすることができないかもしれません。
private
ライブラリ作成者は、ライブラリのprivate
内部の詳細を何年も維持することを余儀なくされることなく、ライブラリを管理可能なサイズのメソッド(およびヘルパークラス)に分割できます。
コンパイラが情報の隠蔽を強制することが価値があるのは何ですか?
サイドノートでは、Javaでprivate
コンパイラによって強制されていませんが、Javaによる検証バイトコード。
反射はこのメカニズムをオーバーライドできますか?コンパイラが情報の隠蔽を強制することが価値があるのは何ですか?
Javaでは、リフレクションだけでこのメカニズムをオーバーライドできません。private
Javaには2種類あります。これprivate
により、ある外部クラスprivate
が、バイトコード検証によってチェックされる別の外部クラスのメンバーにアクセスできなくなります。またprivate
、
public class C {
private int i = 42;
public class B {
public void incr() { ++i; }
}
}
クラスB
(実際の名前C$B
)はを使用するi
ため、コンパイラは合成アクセサメソッドを作成し、バイトコード検証を通過する方法でB
アクセスできるようにしますC.i
。残念ながら、からClassLoader
クラスを作成できるため、で新しいクラスを作成することで内部クラスに公開さbyte[]
れたプライベートを取得するのは非常に簡単C
ですC
C
のjarがシールされていない場合に可能のパッケージにです。
適切なprivate
施行には、クラスローダー、バイトコード検証、およびプライベートへのリフレクトアクセスを防止できるセキュリティポリシー間の調整が必要です。
クラスの秘密状態を攻撃から保護するために使用できますか?
はい。「安全な分解」は、プログラマがモジュールのセキュリティプロパティを保持しながら協力できる場合に可能になります。モジュールのセキュリティプロパティに違反しないように、別のコードモジュールの作成者を信頼する必要はありません。
Joe-Eのようなオブジェクト機能言語は、情報隠蔽およびその他の手段を使用して、安全な分解を可能にします。
Joe-Eは、オブジェクト機能の規律に従って安全なプログラミングをサポートするように設計されたJavaプログラミング言語のサブセットです。Joe-Eは、安全なシステムの構築を容易にし、Joe-Eで構築されたシステムのセキュリティレビューを容易にすることを目的としています。
そのページからリンクされている論文は、private
強制が安全な分解を可能にする方法の例を示しています。
安全なカプセル化を提供します。
図1.追加専用のロギング機能。
public final class Log {
private final StringBuilder content;
public Log() {
content = new StringBuilder();
}
public void write(String s) {
content.append(s);
}
}
図1を検討してください。図1は、追加専用のログ機能を構築する方法を示しています。プログラムの残りの部分がJoe-Eで記述されている場合、コードレビュアーは、ログエントリは追加のみ可能で、変更または削除はできないと確信できます。このレビューはLog
クラスの検査のみを必要とし、他のコードのレビューを必要としないため、実用的です。したがって、このプロパティを検証するには、ログコードに関するローカルな推論のみが必要です。