簡體   English   中英

反射類Java

[英]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.

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