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