比方说,我有一个方法,返回一个自定义的List
与一些对象。它们作为Object
返回给我。我需要从这些对象中获取某个字段的值,但是我不知道对象的类。
有没有办法通过反射或其他方式做到这一点?
如果知道字段所在的类,可以使用反射来访问它。这个示例(在Groovy中,但方法调用是相同的)为类Foo获取一个Field对象,并为对象b
获取其值。它表明您不必关心对象的具体类,重要的是您知道字段所在的类,并且该类是对象的具体类或超类。
groovy:000> class Foo { def stuff = "asdf"}
===> true
groovy:000> class Bar extends Foo {}
===> true
groovy:000> b = new Bar()
===> Bar@1f2be27
groovy:000> f = Foo.class.getDeclaredField('stuff')
===> private java.lang.Object Foo.stuff
groovy:000> f.getClass()
===> class java.lang.reflect.Field
groovy:000> f.setAccessible(true)
===> null
groovy:000> f.get(b)
===> asdf
我强烈建议使用Java泛型来指定列表中的对象类型,即List
但是,您可以使用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));
}
运行此命令的输出为:
值=[C@1b67f74
value=3
假设一个简单的情况,其中您的字段是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);
}
但这很难看,我忽略了所有的try捕获,并做出了一些假设(公共字段、可用的反射、良好的安全管理器)。
如果可以更改方法以返回List
List<Foo> list; //From your method
for(Foo foo:list) {
Object fieldValue = foo.fieldName;
}
或者,如果您正在使用Java1.4接口,其中泛型不可用,但您知道应该在列表中的对象类型...
List list;
for(Object x: list) {
if( x instanceof Foo) {
Object fieldValue = ((Foo)x).fieldName;
}
}
不需要反思:)
问题内容: 说,我有一个方法返回带有一些对象的自定义。他们归还了我。我需要从这些对象中获取某个字段的值,但是我不知道这些对象的类。 有没有办法通过Reflecion或其他方式做到这一点? 问题答案: 假设一个简单的情况,您的字段是: 但这很丑陋,我省略了所有尝试,并提出了许多假设(公共领域,可用的反射,不错的安全管理器)。 如果您可以更改返回a的方法,这将变得非常容易,因为迭代器随后可以为您提供类
问题内容: 我有一个具有String字段的对象。我可以通过致电获得该字段: 我设置了一个方法来设置此实例的字段的值,但是各个getter似乎是,这很奇怪,因为我希望它是。 如何获取实例的值? 问题答案: 如果使用,则“ setter”为,“ getter”为。在 这两种 情况下,第一个参数都是您要在其上访问字段的实例。
我发现这是一个私人领域,没有直接的方法来获得它。有办法出去吗?我使用jdk7。tks前进。
现在,有没有可能通过反思来实现这一点呢?
问题内容: 说我有一个具有一些成员变量的类,一个或多个是具有成员变量的另一个类。如何获得两个类中每个变量的值? 我可以通过以下方式获取变量:通过调用Foo对象的值,然后再次对其进行迭代以获取子类变量。 但是,如何在没有该类实例的情况下获取每个子类成员变量的值?我的平凡示例之所以有用,是因为该类的每个实例的变量都相同,因此我可以调用 我想如果能以某种方式从字段中获取对象的实例,那可能会起作用? 提前
问题内容: 我有一个方法: 当运行时,我得到如下输出: 现在我该怎样提取实际字符串值入, 使用反射? 问题答案: 看起来您需要引用该类的实例。您可能要调用get和pass的引用,将返回值转换为String。 您可以使用get,如下所示: