[解決済み] このJavaコードスニペットはどのように動作するのですか?(文字列プールとリフレクション) [重複].
2023-05-13 17:18:50
質問
Java文字列プールとリフレクションの組み合わせは、Javaで想像もつかないような結果を生み出すことがあります。
import java.lang.reflect.Field;
class MessingWithString {
public static void main (String[] args) {
String str = "Mario";
toLuigi(str);
System.out.println(str + " " + "Mario");
}
public static void toLuigi(String original) {
try {
Field stringValue = String.class.getDeclaredField("value");
stringValue.setAccessible(true);
stringValue.set(original, "Luigi".toCharArray());
} catch (Exception ex) {
// Ignore exceptions
}
}
}
上記のコードが表示されます。
"Luigi Luigi"
マリオはどうなった?
どのように解決するのですか?
<ブロッククオートマリオはどうなったのですか?
あなたはそれを変更しました、基本的に。そうです、リフレクションを使えば文字列の不変性を破ることができます...そして文字列インターニングにより、(コンパイル時に解決されたであろうより大きな文字列定数式以外での)マリオの使用はプログラムの残りの部分でquot;ルイジとして終わってしまうことを意味します。
このようなことが、リフレクションがセキュリティパーミッションを必要とする理由です...
式に注意してください。
str + " " + "Mario"
は
ではなく
の左結合性により、コンパイル時の連結は一切行われません。
+
. これは事実上
(str + " ") + "Mario"
であり、そのため、まだ
Luigi Luigi
. というコードに変更すると
System.out.println(str + (" " + "Mario"));
... すると、次のようになります。
Luigi Mario
と表示され、コンパイラは
" Mario"
を別の文字列に変換して
"Mario"
.
関連
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] Javaで文字列を分割する方法
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
プロジェクトの依存関係を解決できない。
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
Junitのユニットテストはjava.lang.Testを報告します。
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
maven レポート エラー 解決不可能な親POM
-
[解決済み] Java の文字列は本当に不変なのですか?