★ 准备工作
定义一个Model类,里面所有的属性都是private的,然后为每个属性提供getter和setter方法;
再准备一个Map,map的key值都是类里面的属性字段的字符串表示,值任意。
★ 真正的工作
设计一个方法Object getModel(Map map,Class cls),传入一个包含所有值的Map,然后再传入Model类的class,那么返回Model类的实例,这个实例里面已经包含好了所有相关的数据。也就是把Map中的数据通过反射,设置回到Model类实例中。
BeanUtils类:
package cn.hncu.reflect.test.beanUtil;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
/**
*
(模拟Java内省的功能)
★ 准备工作
(1)定义一个Model类,里面所有的属性都是private的,然后为每个属性提供getter和setter方法;
(2)再准备一个Map,map的key值都是类里面的属性字段的字符串表示,值任意。
★ 真正的工作
(3)设计一个方法Object getModel(Class cls,Map map)。
(4)传入一个包含所有值的Map,然后再传入Model类的class。
(5)那么返回Model类的实例。这个实例里面已经包含好了所有相关的数据。
(6)也就是把Map中的数据通过反射,设置回到Model类实例中。
*/
public class BeanUtils {
//(1)定义一个Model类
//(2)构造hashmap
//(3)构造一个Object getModel(Class cls,Map map)。
@Test
public static <T> T getModel(Class<T> cls,HashMap<String , Object> map) throws Exception{
T obj=cls.newInstance();
//1)得到Class的对象----遍历其中所有的字段,由map中的key获得其value,将此value设置到cls对象中。
Field[] flds=cls.getDeclaredFields();
for(Field fld:flds){
System.out.println(fld.getName());
Object data=map.get(fld.getName());
if(data==null){
System.out.println(fld.getName()+"数据不存在!");
}else{
//2)生成方法名----通过构造好的方法名调用此方法设置此model中的字段值
String methodName="set"+fld.getName().substring(0, 1).toUpperCase()+fld.getName().substring(1);
//3)找到对象方法名的method方法
Method m=cls.getDeclaredMethod(methodName, fld.getType());
//4)执行该method方法----invoke
m.invoke(obj, data);
}
}
return obj;
}
}
Client类(用户测试):
package cn.hncu.reflect.test.beanUtil;
import java.util.HashMap;
public class Client {
public static void main(String[] args) {
HashMap<String , Object> map=new HashMap<String, Object>();
map.put("uuid", "00001");
map.put("name", "Tom");
map.put("type", 2);
map.put("pwd", "1234");
try {
UserModel user=(UserModel) BeanUtils.getModel(UserModel.class, map);
System.out.println(user.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
UserModel类:
package cn.hncu.reflect.test.beanUtil;
import java.io.Serializable;
public class UserModel implements Serializable{
private String uuid;//用户id
private String name;//用户名
private int type;//用户类型
private String pwd;
public UserModel() {
super();
}
public UserModel(String uuid, String name, int type, String pwd) {
super();
this.uuid = uuid;
this.name = name;
this.type = type;
this.pwd = pwd;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((pwd == null) ? 0 : pwd.hashCode());
result = prime * result + type;
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserModel other = (UserModel) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (pwd == null) {
if (other.pwd != null)
return false;
} else if (!pwd.equals(other.pwd))
return false;
if (type != other.type)
return false;
if (uuid == null) {
if (other.uuid != null)
return false;
} else if (!uuid.equals(other.uuid))
return false;
return true;
}
@Override
public String toString() {
return "UserModel [uuid=" + uuid + ", name=" + name + ", type=" + type
+ ", pwd=" + pwd + "]";
}
}