読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

今日の罠

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