Java反射:如何从对象获取字段值,而不知道它的类

svz*_*svz 31 java reflection

说,我有一个返回List带有一些对象的自定义的方法.他们归还Object给我了.我需要从这些对象中获取某个字段的值,但我不知道对象的类.

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

Cha*_*lie 44

假设一个简单的案例,你的领域是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);
}
Run Code Online (Sandbox Code Playgroud)

但这非常难看,我遗漏了所有的尝试捕获,并做了一些假设(公共领域,反射可用,很好的安全管理器).

如果你可以改变你的方法来返回a List<Foo>,那么这变得非常容易,因为迭代器可以给你类型信息:

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

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

List list;
for(Object x: list) {
   if( x instanceof Foo) {
      Object fieldValue = ((Foo)x).fieldName;
   }
}
Run Code Online (Sandbox Code Playgroud)

不需要反思:)


Eri*_*ich 6

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

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

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));
}
Run Code Online (Sandbox Code Playgroud)

运行它有一个输出:

值=[C@1b67f74
值=3