Java反射:如何在不知道其类的情况下从对象中获取字段值

2022-09-01 03:03:53

假设,我有一个方法,它返回一些对象的自定义。他们被归还给我。我需要从这些对象中获取某个字段的值,但我不知道这些对象的类。ListObject

有没有办法通过Reflecion或其他方式做到这一点?


答案 1

假设一个简单的情况,其中您的字段是:public

List list; // from your method
for(Object x : list) {
    Class<?> clazz = x.getClass();
    Field field = clazz.getField("fieldName"); //Note, this can throw an exception if the field doesn't exist.
    Object fieldValue = field.get(x);
}

但这非常丑陋,我省略了所有的尝试,并做出了一些假设(公共领域,可用的反射,不错的安全管理器)。

如果您可以更改方法以返回 a ,这将变得非常容易,因为迭代器可以为您提供类型信息:List<Foo>

List<Foo> list; //From your method
for(Foo foo:list) {
    Object fieldValue = foo.fieldName;
}

或者,如果您正在使用泛型不可用的Java 1.4接口,但您知道应该在列表中的对象的类型...

List list;
for(Object x: list) {
   if( x instanceof Foo) {
      Object fieldValue = ((Foo)x).fieldName;
   }
}

无需反射:)


答案 2

我强烈建议使用Java泛型来指定该列表中的对象类型,即。.如果你有汽车和卡车,你可以使用一个通用的超类/接口,就像这样。List<Car>List<Vehicle>

但是,您可以使用Spring的ReflemUtils使字段可访问,即使它们是私有的,如下面的可运行示例所示:

List<Object> list = new ArrayList<Object>();

list.add("some value");
list.add(3);

for(Object obj : list)
{
    Class<?> clazz = obj.getClass();

    Field field = org.springframework.util.ReflectionUtils.findField(clazz, "value");
    org.springframework.util.ReflectionUtils.makeAccessible(field);

    System.out.println("value=" + field.get(obj));
}

运行此命令的输出为:

值=[C@1b67f74
值=3