2013-06-03 49 views
0
// 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

+2

你肯定一)領域實際上是不爲空,和b)你的程序在調用'field.get'時沒有拋出異常? –

+2

'returnEntity'如何初始化返回的'Object'?它很可能是'空',因爲該字段尚未初始化。獲取Field.getName()的值並不意味着該字段有價值。 – Genzer

+0

那麼,如果值不爲空,可能需要將修飾符設置爲可訪問的:field.setAccessible(true); 另外,你還可以在這裏粘貼堆棧跟蹤嗎? – dosdebug

回答

3

我猜,但名稱returnEntity建議,你可能會處理與Hibernate(或JPA)實體或相似。

那些只有在通過getter訪問accesst時纔會加載它們的字段。如果您通過字段訪問它們,它們仍然具有所有null值。

+0

這是我的錯誤,我再次查看代碼,它正在工作。回報對象中有很多空值,我認爲有問題。但是當我查看所有字段值時,有一些字段不爲null。對不起浪費你的時間! – Talha

1

一種可能性是您遇到由hibernate在實體上完成的字節碼操作。休眠實體被延遲加載(默認情況下)。當你調用其中一種方法時,hibernate將鉤子放入getter/setter方法中以加載實際值。

您應該始終在hibernate對象中使用getters/setters,而不是直接字段訪問。

+0

這是我的錯誤,我再次查看代碼,它正在工作。回報對象中有很多空值,我認爲有問題。但是當我查看所有字段值時,有一些字段不爲null。對不起浪費你的時間! – Talha

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。但是,如果在TestClassObject o已經初始化的o值不會null

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

這不會是null

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

這是我的錯誤,我再次查看代碼,它正在工作。回報對象中有很多空值,我認爲有問題。但是當我查看所有字段值時,有一些字段不爲null。對不起浪費你的時間! – Talha