2010-04-21 33 views
68

說我有一個類:通過反射獲取一個類的公共靜態最終字段/屬性的值在Java中

public class R { 
    public static final int _1st = 0x334455; 
} 

我怎樣才能獲得通過反射的字段/屬性「_1st」的價值?

+0

'R._1st'無法正常工作?如果你正在談論Android的開發,我認爲'R'類總是在那裏...... – Matthieu 2015-04-23 15:03:00

+0

@Matthieu我也這麼認爲,直到今天,我必須做同樣的事情,但只有'BR'類。 – Sevastyan 2017-11-08 16:08:57

回答

94

首先檢索該類的字段屬性,然後可以檢索該值。如果知道類型,可以使用其中一個get方法(僅用於靜態字段,實際上使用靜態字段,傳遞給get方法的參數將被完全忽略)。否則,你可以用gettype和寫入如下適當的開關:

Field f = R.class.getField("_1st"); 
Class<?> t = f.getType(); 
if(t == int.class){ 
    System.out.println(f.getInt(null)); 
}else if(t == double.class){ 
    System.out.println(f.getDouble(null)); 
}... 
+0

謝謝。我試過了,但沒有奏效。在f.getInt(null)操作中引發異常。我發現了,但是怎麼會有一個例外? – Viet 2010-04-21 18:26:24

+1

你收到了什麼樣的例外? – 2010-04-21 18:35:45

+0

嗨,異常e.getMessage()返回字段名稱,這是「_1st」,沒有別的。 – Viet 2010-04-21 18:41:03

42
R.class.getField("_1st").get(null); 

異常處理作爲練習留給讀者。

基本上你通過反射得到像其他任何其他字段,但是當你調用get方法時,你傳遞一個null值,因爲沒有實例需要執行。

這適用於所有靜態字段,無論它們是最終的。如果該字段不公開,您需要首先調用setAccessible(true),當然SecurityManager必須允許所有這些。

+0

謝謝,但它並沒有幫助... – Viet 2010-04-21 18:25:29

+2

@Viet,你能澄清一下沒有用嗎?也許發佈你的代碼不工作? – Yishai 2010-04-21 18:37:27

+0

嗨,異常e.getMessage()返回字段名稱,這是「_1st」,沒有別的。 – Viet 2010-04-21 18:41:32

1

我沿着相同的路線(通過生成的R類別看),然後我有這種可怕的感覺,這可能是在資源類中的函數。我是對的。

發現這一點: Resources::getIdentifier

認爲這可能救人一段時間。儘管他們對文件表示不鼓勵,但這並不令人感到意外。

+0

適合從其他apks讀取資源 – schwiz 2014-07-09 19:30:36

+0

因此,您推斷這是一個Android問題。應該在標籤中註明... – Matthieu 2015-04-23 15:03:58

+0

這不是一個Android問題,它是一個使用特定示例的Java反射問題。問題根據他們的主題進行標記。 – 2016-12-19 17:05:26

相關問題