我有一堆存储在List
/ Array
中的未知类。
如何从这些类中获取字段的值?
我应该在f.get()
粘贴什么内容?
for(Class<?> cl : ClassList){
for(Field f : cl.getFields()){
try {
f.setAccessible(true);
writeln(f.get( <WHAT TO PASTE HERE> ));
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
就反射而言,我更喜欢依赖于具有比标准Java Reflection API更可读的API的框架。我用了两个:
第一个是Mirror。获取字段值(静态或实例)如下所示:
获取静态字段的值:
Class clazz;
Object value = new Mirror().on(clazz).get().field("fieldName");
获取实例字段的值:
Object target;
Object value = new Mirror().on(target).get().field("fieldName");
您也可以传递java.lang.reflect.Field而不是fieldName String。
获取静态字段的值:
Field aField;
Class clazz;
Object value = new Mirror().on(clazz).get().field(aField);
FEST-Reflect是另一个不错的库(FEST fluent Assertions非常好,BTW)。
import static org.fest.reflect.core.Reflection.*;
// Retrieves the value of the field "name"
String name = field("name").ofType(String.class).in(person).get();
// Retrieves the value of the field "powers"
List<String> powers = field("powers").ofType(new TypeRef<List<String>>() {})
.in(jedi).get();
// Retrieves the value of the static field "count" in Person.class
int count = field("count").ofType(int.class).in(Person.class).get();
// Retrieves the value of the static field "commonPowers" in Jedi.class
List<String> commmonPowers = field("commonPowers")
.ofType(new TypeRef<List<String>>() {})
.in(Jedi.class).get();
所有示例均来自相应图书馆的文档。
基于您提供的代码的一些快速粗略的示例: 用镜子实现你想要的(如果我理解的话):
for(Class<?> cl : classList){
Mirror mirror = new Mirror().on(cl);
for(Field f: mirror.reflectAll().fields()) {
if(java.lang.reflect.Modifier.isStatic(f.getModifiers()) {
writeln(mirror.get().field(f));
}
}
}
我假设您只想读取静态字段。对于对象列表:
for(Object obj : objectList){
for(Field f: new Mirror().on(obj.getClass()).reflectAll().fields()) {
writeln(new Mirror().on(obj).get().field(f));
}
}
与FEST-Reflect相同:
for(Class<?> cl : classList){
for(Field f : cl.getFields()){
if(java.lang.reflect.Modifier.isStatic(f.getModifiers()) {
writeln(field(f.getName()).ofType(f.getType()).in(cl).get());
}
}
}
和
for(Object obj : objectList){
for(Field f: obj.getClass().getFields()) {
if(!java.lang.reflect.Modifier.isStatic(f.getModifiers()) { //not 100% sure if this is required
writeln(field(f.getName()).ofType(f.getType()).in(obj).get());
}
}
}
注意,如果没有实际的类实例(对象)来读取它们,则无法读取实例字段值。
我希望这会有所帮助。当然,这些例子可以使用一些重构。
答案 1 :(得分:1)
您只指向某个字段的字段,而不指向特定对象中的特定字段,并且您必须有一个对象才能从中获取字段值。参数必须是从中提取字段值的对象。如果对象类型错误,则抛出IllegalArgumentException
。所以要小心。这是一个片段来说明:
Field field = Integer.class.getDeclaredField("value"); // I think that's the field name
int val = field.get(new Integer(8)); // returns 8
int val2 = field.get("Hello"); // throws IllegalArgumentException