java - 获取未知类字段的值

标签 java class reflection field

我有一堆未知的类存储在 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();
            }
        }
    }

最佳答案

就反射而言,我更喜欢依赖具有比标准 Java 反射 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 字符串。

获取静态字段的值:

Field aField;
Class clazz;
Object value = new Mirror().on(clazz).get().field(aField);

FEST-Reflect是另一个不错的图书馆(FEST fluent Assertions 真的很棒,顺便说一句)。

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();

所有示例均取自相应库的文档。

一些基于您提供的代码的快速粗略示例: 使用 Mirror 实现您想要的(如果我理解正确的话):

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());
      }
   }
}

请注意,如果没有实际的类实例(对象)来读取它们,您将无法读取实例字段值。

希望对您有所帮助。当然,示例可以使用一些重构。

关于java - 获取未知类字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17819557/

相关文章:

java - 更改之前在 faces-config.xml 中初始化的 bean

java - 需要将未知数量的学生记录添加到学校记录中

java - Java中接口(interface)和类之间的契约

java - 两张图片,一张在 Java 中

c# - ASP.net LoadAssembly 动态

java - list 合并失败 : Attribute application@appComponentFactory updating Firebase libraries

java - 将第三方库与 Maven 一起使用

java - 如何访问同一包中主类中的类

java - 检测由不同 ClassLoader 加载的类的 Class 对象等效性

c# - 注入(inject)通用的 getter 和 setter 以获得比反射更好的性能