繁体   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