2013-04-29 52 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