如何使用反射获得字段值?

时间:2013-06-03 15:38:59

标签: java reflection

// getting entity
Object obj= items.get(i).returnEntity();

// finding fields
for(Field field : obj.getClass().getFields()){          
    if(field.getType().isAssignableFrom(String.class)){             
     Log.v(TAG, field.getName());  // it is working i can get field name

    Object value = field.get(obj); // value always `null` ???

如何获取字段值?

我看了下面的答案,但我不明白为什么我会变空?

How to get the fields in an Object via reflection?

Reflection generic get field value

3 个答案:

答案 0 :(得分:3)

我猜,但名称returnEntity表明您可能正在处理Hibernate(或JPA)实体或类似实体。

当通过getter访问时,那些可能只是懒洋洋地加载它们的字段。如果您通过字段访问它们,则它们仍具有所有null值。

答案 1 :(得分:2)

该字段可能尚未初始化。例如:

class TestClass
{
    Object o;
}

public class Test
{
    public static void main(String[] args)
    {
        TestClass t = new TestClass();
        Class c = t.getClass();
        Field f = c.getDeclaredField("o");
        Object obj = f.get(t);  // will be null
    }
}

在这种情况下,obj将是null。但是,如果Object o中的TestClass已初始化,则o的值不会是null

class TestClass
{
    Object o = new Object();
}

这不是null

Object obj = f.get(t);  // will not be null

答案 2 :(得分:1)

一种可能性是你遇到了hibernate在实体上完成的字节码操作。 hibernate实体是延迟加载的(默认情况下)。当你调用其中一个方法时,hibernate会挂钩到getter / setter方法来加载实际值。

你应该总是在hibernate对象中使用getter / setter,而不是直接访问字段。