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