利用反射,将map集合中key值与Person类中属性名相同的,用map中key的value对Person类的属性赋值。
package cn.itcast.demo;
import java.io.Serializable;
public class Person
{
private String name;
private String sex;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", address=" + address
+ "]";
}
}
package cn.itcast.demo;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Demo3 {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
{
Map<String, String>map=new HashMap<String, String>();
map.put("name", "Tom");
map.put("sex", "男");
map.put("address", "广州");
Person p=new Person();
//1、得到集合中的所有key
Set<String> keys=map.keySet();
//2、得到所有的Person类中的属性
Class clazz=p.getClass();
Field[] fields=clazz.getDeclaredFields();//属性是私有的,用getDeclaredFields()
//3、遍历属性。判断keys是否包含这些属性
for(Field field:fields)
{
//得到属性名称
String fieldName=field.getName();
if(keys.contains(fieldName))
{
//1、得到value
String value=map.get(fieldName);
//2、得到属性对应的set方法
Method setMethod=clazz.getMethod(getSetMethodName(fieldName),String.class);
//3、对调用方法进行赋值
setMethod.invoke(p, value);
}
}
System.out.println(p);
}
//将字符串的第一个字符转化为大写
public static String getSetMethodName(String param)
{
return "set"+(char)(param.charAt(0)-32)+param.substring(1);
}
}