今日の罠
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変数に代入してるんだ、このモジュールは。