2011-12-27 70 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)(另一個文件)。

我想:

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 

我該怎麼辦呢?

+0

如果'myKeyEvent'類是'public',那麼我想你可以簡單地做這樣的:'場場= KeyEvent.MY_KEYCODE_01;'因爲'MY_KEYCODE_01'領域也是'public' – Bhushan 2011-12-27 15:09:24

+1

更名的事情,方式會令人困惑 - 這些數字對開發者來說並不是特別有用(特別是因爲你似乎跳過了一些)。而且,靜態字段是繼承的,所以你應該能夠以'myKeyEvent.KEYCODE_A'的形式訪問它們(請將該類名稱稍微改好一點)。你究竟想要完成什麼(除了反思,這有點無意義,因爲你已經硬連線了哪個班級......)? – 2011-12-27 16:50:20

回答

5

如果你做myKeyEvent.class.getClass()這個類是myKeyEvent.class你得到的類對象的類是Class。刪除getClass()

您應該能夠在調試器中看到類不正確。

+0

這個moddification被做了,仍然是相同的錯誤:'字段要麼不存在或不公開:java.lang.NoSuchFieldException:MY_KEYCODE_01' – Jorge 2011-12-27 15:05:17

+0

你可以嘗試'System.out.println(Arrays.toString(myKeyEvent.class。 getDeclaredFields()));' – 2011-12-27 15:22:22

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聲明爲靜態最終,它對所有對象具有相同的值。因此,作爲getInt函數的參數,我們使用null。

0

你到底需要什麼?你可以在Java中使用反射來做到這一點,但我確定你不需要,也不需要這樣做。通過String名稱訪問變量並不是獲取變量值的常規方式,並且可能會在進一步開發中導致很多問題。

也許嘗試修改字典或枚舉類型?

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

希望你會得到想要的值。