我创建了一个类来扩展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;
}
现在,我想通过变量名获得整数值(例如:"MY_KEYCODE_01"应该从另一个类(另一个文件)返回整数值keyeevent . keycode_a)。
I tried to:
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
我该怎么做?
类是myKeyEvent.class
,如果你做myKeyEvent.class.getClass()
,你得到的类对象的类是Class
。删除getClass()
您应该能够在调试器中看到类是不正确的。
你到底需要它做什么?您可以在Java中使用反射来做到这一点,但我很确定您不希望也不需要这样做。通过带有名称的字符串访问变量并不是获取变量值的常规方法,并且可能在进一步的开发中导致许多问题。
也许尝试适应一个字典或枚举类型代替?
变量MY_KEYCODE_01
和MY_KEYCODE_30
被声明为静态。所以你不需要使用getClass
。只需使用myKeyEvent.MY_KEYCODE_01
或myKeyEvent.MY_KEYCODE_30
并在Logcat中打印它。像这样:
Log.i("TAG", "Field value is " + myKeyEvent.MY_KEYCODE_01);
可能的代码如下:
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声明为static final,它对所有对象具有相同的值。因此,作为getInt
函数的参数,我们使用null