2013-04-29 46 views
0

嗨,我有一個類[許多],我在運行時動態創建對象。現在我想爲字段which are private fields設置值。我如何設置它們。Java - 反思。設置動態創建的類對象的值

我見過很多解釋這個問題的例子,但是我們需要知道字段名稱,只能設置值。

對於我的情況我有一組基本和非基本類型的默認值,並在運行時找到字段類型並設置它們的默認值。

例如:

LoginBean loginBean = new LoginBean(); 
Method setUserName = loginBean.getClass().getMethod("setUserName", new Class[]{String.class}); 
setUserName.invoke(loginBean, "myLogin"); 

我的情況是不同的,我甚至不知道field name但必須根據字段類型設置默認值。

如何在春季使用反射或甚至更好。

+0

你可能想解釋對* *爲什麼要這麼做? – Eugene 2013-04-29 08:59:27

回答

1

這個例子上幾個字段設置默認值反射。這些字段具有私人訪問權限,可以通過反射進行切換。 Field.set()用於設置特定實例上的字段的值,而不是使用setter方法。

import java.lang.reflect.Field; 
import java.util.Date; 


public class StackExample { 

    private Integer field1 = 3; 
    private String field2 = "Something"; 
    private Date field3; 

    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { 
     StackExample se = new StackExample(); 

     Field[] fields = se.getClass().getDeclaredFields(); 

     for(Field f:fields){ 
      if(!f.isAccessible()){ 
       f.setAccessible(true); 
       Class<?> type = f.getType(); 

       if(type.equals(Integer.class)){ 
        f.set(se, 100); //Set Default value 
       }else if(type.equals(String.class)){ 
        f.set(se, "Default"); 
       }else if (type.equals(Date.class)){ 
        f.set(se, new Date()); 
       } 
       f.setAccessible(false); 
      } 
      System.out.println(f.get(se)); //print fields with reflection 
     } 
    } 
} 
+0

@Anto如果您有任何問題,請告知我 – 2013-04-29 09:03:16

+0

嗨凱文,謝謝它幫助了我。如果我想打印並看到我設置的值,我該如何做。因爲您知道按名稱打印的字段名稱。假設我不知道該字段,因爲它們是動態創建的。 – 2013-04-29 09:12:28

+0

@Anto我更新了代碼示例以使用反射來打印字段值。基本上它迭代通過字段和使用'field.get()' – 2013-04-29 09:16:22

2

你可以說yourBean.class.getFields();這將給出Field排列。

使用Field你可以找到它的nametype,並用做一個類中所需的工作(設置一定的價值,如果它的類型是==一些基本類型)

0

1)通過使用Spring Constructor/Setter注入。你不需要知道屬性名稱,只需鍵入就可以了。就像如下:

<bean id="myBean" class="myBean"> 
    <constructor-arg type="int"><value>1</value></constructor-arg> 
</bean> 
+0

用java反射,你可能會得到所有的領域和他們的類型。但你不會得到字段的名稱 – 2013-04-29 09:01:11

+0

'Field'有一個屬性'name',這是該字段的名稱! – sanbhat 2013-04-29 09:03:51

+0

字段名稱只提供公共字段的信息,您不能從那裏訪問私有字段。 – 2013-04-29 09:12:45