Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获得;“公共静态最终整型”;按名称计算的值?_Java_Android - Fatal编程技术网

Java 如何获得;“公共静态最终整型”;按名称计算的值?

Java 如何获得;“公共静态最终整型”;按名称计算的值?,java,android,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; } 现在,我想从另一个类(另一个文件)通过变量名获取整数值(例如,“MY_KEYCODE_01”

我创建了一个类来扩展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”应该返回整数值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

如何操作?

如果执行
myKeyEvent.class.getClass()
操作,则类为
myKeyEvent.class
,您将获得类对象的类,即
class
。删除getClass()


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

以下是可能的代码:

 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类的类实例。之后,我们将获得具有指定名称的声明字段。最困难的部分是
value=f.getInt(null)。这里我们得到字段f的值。但在一般情况下,MyKeyEvent类的每个对象的该值都是不同的。因此,正如MY_KEYCODE_01声明为static final一样,它对所有对象都具有相同的值。因此,作为
getInt
函数的一个参数,我们使用null。

您需要它的具体用途是什么?您可以使用Java中的反射来实现这一点,但我非常确定您不希望也不需要这样做。通过名为的字符串访问变量不是获取变量值的常规方法,在进一步开发中可能会导致很多问题


可能尝试改用字典或枚举类型?

变量
MY\u KEYCODE\u 01
MY\u KEYCODE\u 30
声明为静态。因此,您不需要使用
getClass
。只需使用myKeyEvent.MY_KEYCODE_01
或myKeyEvent.MY_KEYCODE_30
并在Logcat中打印即可。像这样的事情:

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

希望您能得到所需的值。

进行了此修改,但仍然存在相同的错误:
字段不存在或不公开:java.lang.NoSuchFieldException:MY_KEYCODE_01
您可以尝试
System.out.println(Arrays.toString(myKeyEvent.class.getDeclaredFields())
如果
myKeyEvent
类是
public
,那么我想您可以这样做:
fieldfield=KeyEvent.MY_KEYCODE\u 01因为
MY_KEYCODE\u 01
字段也是
public
以这种方式重命名东西会让人困惑-这些数字对开发人员没有特别的帮助(特别是因为您似乎跳过了一些)。此外,静态字段是继承的,因此您应该能够以
myKeyEvent.KEYCODE\u A
的形式访问它们(请将该类命名得稍微好一点)。你到底想完成什么(除了反射,反射有点毫无意义,因为你已经硬连线了使用的是哪个类…)?