四月最后一天,下班后去面试,被问到该问题,当时只是大致知道实现思路,具体代码以及api确不知道怎么写,平时还是纸上谈兵的多,防止以后被问到相似问题抓瞎,还是落实到具体的代码上面吧。
MapToClass类
/**
* 通过反射将map中数据转成对应的实例对象
*/
public class MapToClass {
public static <T> T mapToInstance(String className,Map<String,Object> map) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//装载对应的类以及进行实例化
Class<?> clazz = Class.forName(className);
T instance = (T)clazz.newInstance();
//获取所有字段 private protected public
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
//设置私有化变量可以访问
declaredField.setAccessible(true);
//获取变量名称
String name = declaredField.getName();
try {
//对实例化的对象进行赋值
// 此处另一种实现方法
// 1、通过declaredField.getType()获取所需字段类型
///2、根据instanceof方法做if判断,将实际类型转成所需类型
declaredField.set(instance,map.get(name));
} catch (IllegalArgumentException e) {
//如存在字段所需类型与实际类型不匹配时给出提示并返回null
System.err.println("字段"+name+"所需数据类型为:"+declaredField.getType()+
",实际传入数据类型为:"+map.get(name).getClass());
return null;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return instance;
}
public static void main(String[] args) throws Exception {
Map<String,Object> map = new HashMap<>();
map.put("id","1234");
map.put("name","xiaoming");
map.put("score",123);
map.put("address","jilinnongan");
User user = (User)MapToClass.mapToInstance("pojo.User", map);
System.out.println("user:"+user.toString());
}
User类
public class User {
private String id;
private String name;
private Integer score;
private String address;
public User() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", score=" + score +
", address='" + address + '\'' +
'}';
}
}
下次面试好运~