3

以下のコードスニペットが見つかりました:

import java.lang.reflect.Field;
public class Test {
    public static void main(String[] args) {
        System.out.println("Inside main");
    }
    static {
        try {
            Field value = String.class.getDeclaredField("value");
            value.setAccessible(true);
            value.set("Inside main", value.get("Inside static bolck"));
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}

私の理解によると、出力はあるはずですInside static bolckが、出力はInside stat、と同じ文字長のInside main
* Inside mainの長さを増やすと、出力の長さも長くなります。
誰か説明してもらえますか?リフレクションについてはあまり知識がありません。

4

4 に答える 4

4

私のJDKには、新しい長さを反映するように更新する必要がStringあるメンバーもあります。count

offset更新が必要な場合と必要でない場合があるフィールドもあります(おそらくそうではありません)。

最後に、hashフィールドがあります。これは、変更すると正しくなくなりますvalue

このコードは、の特定の実装の文書化されていない詳細に依存しているため、String非常に壊れやすく、移植性が非常に低くなっています。たとえば(ハットチップ@assylias)、OracleはJDK7u6のフィールドcountoffsetフィールドを削除しました。7u5から7u6にアップグレードすると、突然コードの動作が異なります。

于 2013-03-15T12:49:19.810 に答える
1

このコードは、Stringクラスの実際の実装について想定しています。たとえば、クラスには「value」というフィールドがあります。

Stringクラスの内部状態はAPIまたは言語仕様の一部ではないため、実際の実装は、異なるベンダーのVM間、または同じベンダーの異なるVMバージョン間でさえ異なります。

于 2013-03-15T12:59:30.993 に答える
0

"Inside main" value []に​​11文字が含まれています(value []はStringクラスのプライベートフィールドです)
Stringvalue[]は、Stringを定義する最初の場所で初期化されました"Inside main"。ここvalue[]で、リフレクションを使用して文字列のプライベートインスタンス変数であるの値を変更しているので、文字列から11文字だけを入力する必要がありますInside static bolck

于 2013-03-15T13:03:06.200 に答える
0

「Insidemain 」を変更する場合はvalue.get()、文字列<=「Insidemain」を使用できます。-「Insidemain」を「Insidemain(8スペース)」に変更すると、次のように出力されます。

"Inside static bolck"
于 2013-03-15T13:13:53.980 に答える