以下の内容はhttps://unageanu.hatenablog.com/entry/20091005/1254735566より取得しました。


今日の罠

Class.getField()親のstatic変数も探索します。例えば、以下のコードを実行すると、

  • Child.B,Child.C,Parent.Aには値が設定される。
  • Parent.Bは初期化されない。
    • Child.Bが先に見つかるのでそちらが返されてしまうため。

という結果になります。

public static void main ( String[] args ) {
    
    // 定数を探して値を設定する。
    for ( String str : new String[] { "A","B","C" } ) {
        try {
            Child.class.getField( str ).set( null, str + str );
        } catch (Exception e ) {
            e.printStackTrace();
        }
    }
    System.out.println( "Parent A : " + String.valueOf( Parent.A ) );
    System.out.println( "Parent B : " + String.valueOf( Parent.B ) );
    System.out.println( "Child B : " + String.valueOf( Child.B ) );
    System.out.println( "Child C : " + String.valueOf( Child.C ) );

}

// 親
public static class Parent {
    public static String A;
    public static String B;
}
// 子
public static class Child extends Parent {
    public static String B;
    public static String C;
}

実行結果です。

Parent A : AA
Parent B : null
Child B : BB
Child C : CC

つまり、親のXMessageで定義されている定数と同じ定数を子のXMessageで定義してしまうと、loadModule()で親の定数が初期化されずメッセージが空になるわけですね。うへぇ。

というかそもそも、何でメッセージリソースをわさわざstatic変数に代入してるんだ、このモジュールは。




以上の内容はhttps://unageanu.hatenablog.com/entry/20091005/1254735566より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14