Java反射:如何在不知道其类的情况下从对象中获取字段值
2022-09-01 03:03:53
假设,我有一个方法,它返回一些对象的自定义。他们被归还给我。我需要从这些对象中获取某个字段的值,但我不知道这些对象的类。List
Object
有没有办法通过Reflecion或其他方式做到这一点?
假设,我有一个方法,它返回一些对象的自定义。他们被归还给我。我需要从这些对象中获取某个字段的值,但我不知道这些对象的类。List
Object
有没有办法通过Reflecion或其他方式做到这一点?
假设一个简单的情况,其中您的字段是: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;
}
}
无需反射:)
我强烈建议使用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