当前位置: 首页 > 知识库问答 >
问题:

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

双恩
2023-03-14

比方说,我有一个方法,返回一个自定义的List与一些对象。它们作为Object返回给我。我需要从这些对象中获取某个字段的值,但是我不知道对象的类。

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

共有3个答案

穆歌者
2023-03-14

如果知道字段所在的类,可以使用反射来访问它。这个示例(在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
邹晟睿
2023-03-14

我强烈建议使用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

田文景
2023-03-14

假设一个简单的情况,其中您的字段是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,如下所示: