8

Sun Certification スタディ ガイドを確認していますが、最終修飾子について説明している箇所があります。それは言う

「私たちが知っているように、プログラマーが String クラスの文明を自由に拡張できたら、それは崩壊する可能性がある」

彼はどういう意味ですか?String Class を拡張できるとしたら、すべての Strings プロパティを継承する MyString という名前のクラスはありません。それを拡張するだけで、実際の String クラスを何らかの方法で変更するにはどうすればよいでしょうか?

ご回答ありがとうございました

4

6 に答える 6

6

問題の 1 つは、String クラスをサブクラス化できる場合、さまざまな方法で jvm のセキュリティを覆す可能性が高いことです。権限の多くは、さまざまな文字列値をチェックして、特定のアクションが許可されているかどうかを判断します。コードが文字列値を提供している場合は、セキュリティ マネージャーが参照したときに「チェックアウト」する String インスタンスを返すことができますが、後でまったく異なる値のように動作します。

たとえば、機密性の高い jvm 全体の構成があるとします。

public static void registerProvider(String providerName, Provider impl) {
  SecurityManager sm = ...;
  if(sm != null) {
    // say the check provider method doesn't allow strings starting with "com.sun."
    sm.checkProvider(providerName);
  }
  _providerMap.put(providerName, impl);
}

ここで、値が渡された場合startsWith()に返すメソッドをオーバーライドするカスタム String を実装しますが、String の実際の値は で始まります。false"com.sun."com.sun.

もちろん、文字列が不変であるという一般的な期待は言うまでもありません。これは、壊れた場合、あらゆる種類の一般的な大混乱を引き起こす可能性があります(他の回答で詳しく説明されています)。

于 2013-03-01T19:51:56.783 に答える
4

クラスを拡張しても、基本クラスには影響しません。ただし、基本クラスのコンシューマーに影響を与える可能性があります。

したがって、を拡張できたしましょうString。次のように記述できます。

class MyString extends String {

    @Override
    public int length() {
        System.exit();
    }
}

このクラスを文字列を使用するすべてのものに渡すと、すぐにプログラムを終了する可能性があります。文明の終わりではありませんが、あなたができるもっと邪悪なことがあります.

于 2013-03-01T19:51:48.263 に答える
2

Java API 全体で、次のような構造が表示されることを考慮してください。

HashMap<String, Object> map;

インデックス付けに文字列を使用します。非常に一般的なことです。たとえば、プロパティや - そしておそらくセキュリティ関連の場所では最悪です。Stringこのコードは、安全性を維持するために変更されていないものに依存しています。

ただし、変更されたStringクラスで、たとえば文字列をその場で逆にすることができるようにします。

そうなると、私たちが知っている世界は崩壊するでしょう。ロギングが壊れるなど。

多くのコードは、Stringクラスが immutableであることを前提としています。それが本当に不変であるとすれば、どのような機能を追加したいと思うでしょうか?

于 2013-03-01T19:52:07.163 に答える
1

クラスを拡張しても、クラスにはまったく影響しません。ただし、継承されたクラスは基本クラスでもあるため、基本クラスの動作規約に従う必要があります。プログラマーが一般的なフレームワークの型を変更した場合、それらのクラスが期待どおりに機能することは期待できません。したがって、そのようなクラスを悪用するオプションを防止したい-これはfinalキーワードを使用して行われます

于 2013-03-01T19:53:41.407 に答える
0

大惨事の誇張はおそらく、String の (im)mutability のセキュリティ面への暗示です。多くの場合、文字列はパラメーターとしてさまざまな I/O リソース接続 API (JDBC やファイル I/O など) に渡されます。このような文字列は、多くの場合、リソース ロケーターと認証資格情報の連結であり、その API は、接続を返す前に、要求されたリソースに対して資格情報が有効であることを確認するためのチェックを実行します。 文字列が可変である場合、認証が成功した後にリソース ポインター/アドレス (DB 接続のデータベース名やユーザーの機密情報を含むファイル名など)が変更される可能性があるため、あらゆる種類のセキュリティ違反に対してゲートウェイが開かれます。ただし、要求された元のリソースのリソース接続が確立される前、その結果、不正アクセスが発生し、アクセス制御が破壊されます。

String を不変にするもう 1 つの理由は、スレッドセーフにすることです。

于 2013-03-01T20:06:10.747 に答える