2016-07-22 2 views
4

こんにちはすべて以下のように内部クラスに存在する列挙型の値にアクセスしようとしていますが、 。私のアプリケーションの必要性は、私はこの価値観に反映する必要があるということです。Reflectionを介して内部クラスに存在する列挙型の値を取り出す方法

public class Test{ 
static class TwelveByTwentyFour { 
    public static enum BET_TYPE_NAME { 
     Direct12(12),AllOdd(12),AllEven(12), First12(12), Last12(12); 

    private int value; 
    BET_TYPE_NAME(int value){ 
       this.value = value; 
      } 

      public int getValue() { 
       return value; 
      } 
      public void setValue(int value) { 
       this.value = value; 
      } 
    } 

} 
public static String getBetTypeLength(String gameName,String betType) throws ClassNotFoundException, IllegalArgumentException, SecurityException, IllegalAccessException, NoSuchFieldException{ 
     return Class.forName(Test.class.getCanonicalName()+"$"+gameName+"$"+"BET_TYPE_NAME").getDeclaredField(betType).get(null).toString(); 
    } 
public static void main(String[] args) throws IllegalArgumentException, SecurityException, ClassNotFoundException, IllegalAccessException, NoSuchFieldException { 
    System.out.println(getBetTypeLength("TwelveByTwentyFour", "AllEven")); 
} 

}

これを行うには、私が代わりに"12"の出力として"AllEven"を取得しています。誰でも私にその価値をどのように得ることができるのかを教えてもらえますか?

答えて

1

BET_TYPE_NAME.AllEven.toString()を呼び出していて、BET_TYPE_NAME.AllEven.name()と同じ値を返すように親のEnumクラスに実装されているため、"AllEven"となります。

@Override 
public String toString() { 
    return this.value; 
} 

または列挙BET_TYPE_NAMEField.get(null)の結果をキャストし、それにgetValue()を呼び出す:

return Integer.toString(((TwelveByTwentyFour.BET_TYPE_NAME) 
     Class.forName(Test.class.getCanonicalName()+"$"+gameName+"$"+"BET_TYPE_NAME") 
       .getDeclaredField(betType).get(null)).getValue()); 

"12"を取得するには、あなたのいずれかがBET_TYPE_NAME列挙型のような内部のtoString()をオーバーライドする必要があります

ところで、enumは決してセッターを持つべきではなく、valueは常にfinalです。列挙型定数は共有シングルトンです。

関連する問題