2011-12-27 13 views
3

私はたKeyEventを拡張するクラスを作成しました:"public static final int"値を名前で取得するには?

public class myKeyEvent extends KeyEvent { 
    public static final int MY_KEYCODE_01 = KeyEvent.KEYCODE_A; 
    //... 
    public static final int MY_KEYCODE_30 = KeyEvent.KEYCODE_Z; 
} 

さて、私は(例えば「MY_KEYCODE_01は」整数値KeyEvent.KeyCODE_Aを返す必要があります。)変数名で整数値を取得したい別のクラスから(別のファイル)。 LogCatで

try{ 
    Class cls = myKeyEvent.class.getClass(); 
    Field field = cls.getDeclaredField("MY_KEYCODE_01"); 
    int value = (Integer) field.get(cls); 
    Log.v("TAG", "Field value is " + value); 

} catch (NoSuchFieldException e) { 
    Log.e("TAG", "Field either doesn't exist or is not public: " + e.toString()); 
} 

は私がしようとした

Field either doesn't exist or is not public: java.lang.NoSuchFieldException: MY_KEYCODE_01 

私はそれをどのように行うことができますか?

+0

'myKeyEvent'クラスが' public'の場合、 'MY_KEYCODE_01'フィールドも' public'なので、 'Field field = KeyEvent.MY_KEYCODE_01;'のように単純に行うことができますね – Bhushan

+1

混乱するだろう - それらの数字は開発者にとって特に役立つものではない(特にあなたがいくつかをスキップしたようなので)。また、静的フィールドが継承されているので、あなたは(少し良く、そのクラスに名前を付けてください) 'myKeyEvent.KEYCODE_A'としてそれらにアクセスすることができるはずです。正確に何を達成しようとしているのですか?(リフレクションの他に、あなたはどんなクラスが使われているので、少し無意味です...)? –

答えて

5

あなたがmyKeyEvent.class.getClass()を実行すると、クラスはmyKeyEvent.classとなり、クラスオブジェクトのクラスはClassになります。あなたはクラスがデバッガで正しくない見ることができるはずはgetClass()

をドロップします。ここで

+0

このmoddificationが行われ、まだ同じエラーました: 'フィールドが存在しないか、またはパブリックではありません:java.lang.NoSuchFieldExceptionの:MY_KEYCODE_01' – Jorge

+0

あなたは'のSystem.out.println(Arrays.toString(myKeyEvent.classを試すことができます。 getDeclaredFields())); ' –

0

が可能なコードです:

int value=0; 
    try { 
     Class aClass = MyKeyEvent.class; 

     Field f = aClass.getDeclaredField("MY_KEYCODE_01"); 
     Log.d(TAG, f.toString()); 
     value = f.getInt(null); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchFieldException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    Log.d(TAG, "value = " + value); 

私も説明を追加することにしました。 Class aClass = MyKeyEvent.class;行では、MyKeyEventクラスを表すClassのインスタンスを作成します。その後、指定された名前のフィールドが宣言されます。最も難しい部分はvalue = f.getInt(null);です。ここでフィールドfの値を取得します。しかし、一般的なケースでは、この値はMyKeyEventクラスのすべてのオブジェクトで異なります。したがって、MY_KEYCODE_01が静的finalとして宣言されると、すべてのオブジェクトに対して同じ値を持ちます。したがって、getInt関数のパラメータとしてnullを使用します。

0

まさにあなたはそれを何が必要ですか?あなたはJavaでのリフレクションを使用してこれを行うことができますが、私はあなたが本当にこれをする必要はないと確信しています。名前で文字列で変数にアクセスすることは、変数の値を取得する通常の方法ではなく、今後の開発で多くの問題を引き起こす可能性があります。

たぶん代わりに辞書や列挙型を適応しようか?

0

varriable MY_KEYCODE_01MY_KEYCODE_30はstaticとして宣言されています。したがって、getClassを使用する必要はありません。 myKeyEvent.MY_KEYCODE_01またはmyKeyEvent.MY_KEYCODE_30を使用して、Logcatで印刷してください。このようなもの:

Log.i("TAG", "Field value is " + myKeyEvent.MY_KEYCODE_01); 

希望値を取得します。

関連する問題