[英]Reflection class java
我有這兩個類,我希望第二個類( DocumentiDiIdentitaList )基於在第一個類( DocumentiDiIdentita )中聲明的變量的所有值創建一個列表
其實我得到了這段代碼
public class DocumentiDiIdentita {
public static final String CARTA_IDENTITA = "CI";
public static final String CARTA_IDENTITA_AFTER_25_06_2003 = "CI_NEW";
public static final String PASSAPORTO_CONSOLATO = "PC";
public static final String PASSAPORTO_QUESTURA = "PQ";
public static final String PASSAPORTO_ESTERO = "PE";
public static final String PATENTE_MORIZZAZIONE = "PZ";
public static final String PATENTE_PREFETTURA = "PT";
public static final String PORTOARMI = "PM";
public static final String PASSAPORTO="PA";
}
public static class DocumentiDiIdentitaList {
private static Field[] fields = DocumentiDiIdentita.class.getFields();
public static List documentTypes = Arrays.asList(fields);
}
但是實際上列表documentTypes包含變量的名稱,而不是它們的值,因此實際上是:
CARTA_IDENTITA
CARTA_IDENTITA_AFTER_25_06_2003
PASSAPORTO_CONSOLATO
etc.
但我想要:
CI
CI_NEW
PC
etc.
我怎樣才能做到這一點? (我必須在Java 1.4上運行)
Java Reflections API允許您以編程方式對元模型(即類,方法,字段等)進行操作。它們是代碼的結構信息。 這意味着,當您獲得對Field
實例的訪問權時,它引用的是由類聲明的字段,而不是類實例(也稱為對象)的字段的實例。
為了使用反射獲取字段的值,必須使用field.get(instance)
讀取給定實例的值。 對於靜態字段和方法,實例是類本身。 但是您不能傳遞類本身,因為.class是具有自己的字段和方法的對象,因此field.get(DocumentiDiIdentita.class)
將無法工作。 相反,要訪問靜態值,請傳遞null
作為參數。
在Java 1.4及更高版本中,您可以執行
Field[] fields = DocumentiDiIdentita.class.getFields();
List documentTypes = new ArrayList();
for(int i = 0; i < fields.length; i++){
Field f = fields[i];
documentTypes.add(f.get(null));
}
從Java 5開始,您可以使用泛型和for-each循環:
Field[] fields = DocumentiDiIdentita.class.getFields();
List<String> documentTypes = new ArrayList<String>();
for(Field f : fields){
documentTypes.add(f.get(null));
}
在Java8中,您可以使用流
List docTypes = Stream.of(DocumentiDiIdentita.class.getFields()).map(this::uncheckedGet).collect(Collectors.toList());
private Object uncheckedGet(Field f) {
try {
return f.get(null);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
為了便於閱讀,我省略了上述Java 1.4和1.5示例的異常處理。 您可以用java 8示例的uncheckedGet方法替換field.get調用,或者重用異常處理。
獲取靜態字段值有些棘手。 您需要傳遞null以獲得這樣的方法:
public class DocumentiDiIdentitaList {
public static void main(String[] args) {
Field[] fields = DocumentiDiIdentita.class.getDeclaredFields();
Arrays.stream(fields).forEach(f -> {
try {
System.out.println(f.get(null));
}
catch (IllegalAccessException e) {}
});
}
}
希望我有所幫助:)
-編輯
抱歉Java8版本:(您能否檢查get方法是否可以使用null值?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.