我有一个类[many],我在运行时动态地为它创建对象。现在我要设置字段which are private fields
的值。如何设置它们
我看到过很多解释这个的例子,但是我们需要知道字段名,只有知道值才能设置。
对于我的例子,我有一组基本类型和非基本类型的默认值,并在运行时查找字段类型并为它们设置默认值。
例如:LoginBean loginBean = new LoginBean();
Method setUserName = loginBean.getClass().getMethod("setUserName", new Class[]{String.class});
setUserName.invoke(loginBean, "myLogin");
我的情况是不同的,我甚至不知道field name
,但必须根据字段类型设置默认值。
如何使用反射或在春天更好地做到这一点。
您可以输入yourBean.class.getFields();
,它将给出字段数组。
使用Field
,您可以找到它的name
和type
,并做所需的工作(设置一些值,如果它的类型是==一些基本类型)
这个例子使用反射为类中的几个字段设置默认值。这些字段具有私有访问权限,可通过反射打开或关闭。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
}
}
}
1)使用Spring构造函数/Setter注入。你不需要知道属性名,只需要type就可以了。如下所示:
<bean id="myBean" class="myBean">
<constructor-arg type="int"><value>1</value></constructor-arg>
</bean>