簡體   English   中英

如何通過名稱獲取“public static final int”值?

[英]How to get “public static final int” value by name?

我創建了一個擴展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

我該怎么做?

如果你執行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類的Class實例。 之后,我們獲得具有指定名稱的聲明字段。 最困難的部分是value = f.getInt(null); 這里我們得到字段f的值。 但是在一般情況下,MyKeyEvent類的每個對象的值都不同。 因此,當MY_KEYCODE_01聲明為靜態final時,它對所有對象具有相同的值。 因此,作為getInt函數的參數,我們使用null。

你到底需要什么? 你可以使用Java中的反射來做到這一點,但我很確定你不想要,也不需要這樣做。 通過字符串及其名稱訪問變量不是獲取變量值的常規方法,可能會在進一步開發中引起很多問題。

也許嘗試改編詞典或枚舉類型?

可變的MY_KEYCODE_01MY_KEYCODE_30被聲明為靜態。 所以你不需要使用getClass 只需使用myKeyEvent.MY_KEYCODE_01myKeyEvent.MY_KEYCODE_30並在Logcat中打印即可。 有點像這樣:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM