如何通过名称获取“public static final int”值?

时间:2011-12-27 14:56:58

标签: java android

我创建了一个扩展KeyEvent的类:

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;
}

现在,我希望通过变量名获取Integer值(例如“MY_KEYCODE_01”应该从另一个类(另一个文件)返回整数值KeyEvent.KeyCODE_A)。

我试图:

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() );
}

在LogCat中:

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

我该怎么做?

4 个答案:

答案 0 :(得分:5)

如果您myKeyEvent.class获得类myKeyEvent.class.getClass()的类对象,则该类为Class。删除getClass()

您应该能够在调试器中看到该类不正确。

答案 1 :(得分: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。

答案 2 :(得分:0)

你到底需要什么?你可以使用Java中的反射来做到这一点,但我很确定你不想要,也不需要这样做。通过字符串及其名称访问变量不是获取变量值的常规方法,可能会在进一步开发中引起很多问题。

也许尝试改编词典或枚举类型?

答案 3 :(得分:0)

变量MY_KEYCODE_01MY_KEYCODE_30被声明为静态。所以你不需要使用getClass。只需使用myKeyEvent.MY_KEYCODE_01myKeyEvent.MY_KEYCODE_30并在Logcat中打印即可。有点像这样:

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

希望你能得到理想的价值。