说,我有一个返回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)
不需要反思:)
我强烈建议使用 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
| 归档时间: |
|
| 查看次数: |
160795 次 |
| 最近记录: |