說明:
通用實體類型:Snv.java
public class Snv {
private String name;
private String sex;
private Date birthday;
private Double account;
private Map<String,Fv> fvMap;
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 Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Double getAccount() {
return account;
}
public void setAccount(Double account) {
this.account = account;
}
public Map<String, Fv> getFvMap() {
return fvMap;
}
public void setFvMap(Map<String, Fv> fvMap) {
this.fvMap = fvMap;
}
}
具體實體類型:HelpPlan.java
public class HelpPlanDto {
private Long id;
private String planCode;
private String title;
private String introduction;
private String description;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPlanCode() {
return planCode;
}
public void setPlanCode(String planCode) {
this.planCode = planCode;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getIntroduction() {
return introduction;
}
public void setIntroduction(String introduction) {
this.introduction = introduction;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
實體類對象的字段對象:Fv.java 如下:
public class Fv {
private String fvName;
private String dataType;
private Object value;
public Fv(String fvName, String dataType, Object value) {
this.fvName = fvName;
this.dataType = dataType;
this.value = value;
}
public String getFvName() {
return fvName;
}
public void setFvName(String fvName) {
this.fvName = fvName;
}
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
則,現需要將 HelpPlan對象由通用Snv類型轉化爲HelpPlan類型,利用java的反射原理:
public class DTOUtils<T> {
public T snv2Dto(Snv snv,Class<T> clazz) throws Exception{
Map<String,Fv> fvMap = snv.getFvMap();
//獲取字段數組
Field[] fields = clazz.getDeclaredFields();
//創建對象
T ob = clazz.newInstance();
for (Field field : fields) {
//取消每個屬性的安全檢查 ,否則無法獲取private字段值
field.setAccessible(true);
//獲取字段的屬性
String fieldTypeName = field.getGenericType().toString();
Class fieldType = getFieldType(fieldTypeName);
//獲取屬性名稱
String name = field.getName();
String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1,name.length());
Fv fv = fvMap.get(name);
if(fv!=null){
fv.getDataType();
//設置字段值
Method methodSet = ob.getClass().getMethod(methodName, fieldType);
methodSet.invoke(ob,fv.getValue());
}
}
return ob;
}
public Snv dto2Snv(Object object,Class clazz){
return null;
}
/**
* 返回字段類型
* @author
* @param fieldTypeName
* @return
*/
public static Class getFieldType(String fieldTypeName){
Class fieldType = null;
if(fieldTypeName.equals("class java.lang.String"))
fieldType = String.class;
else if(fieldTypeName.equals("class java.lang.Integer"))
fieldType = Integer.class;
else if(fieldTypeName.equals("class java.lang.Boolean"))
fieldType = Boolean.class;
else if(fieldTypeName.equals("class java.util.Date"))
fieldType = java.util.Date.class;
else if(fieldTypeName.equals("class java.lang.Double"))
fieldType = Double.class;
else if(fieldTypeName.equals("class java.lang.Long"))
fieldType = Long.class;
else
fieldType = Object.class;
return fieldType;
}
}
進行測試:
/**
* 初始化實驗類
*/
Snv snv = new Snv();
Fv id = new Fv("id","01",2L);
Fv planCode = new Fv("planCode","02","01001");
Fv title = new Fv("title","02","title");
Fv introduction = new Fv("introduction","02","introduction");
Fv description = new Fv("description","02","description");
Map<String,Fv> fvMap = new HashMap<>();
fvMap.put("id",id);
fvMap.put("planCode",planCode);
fvMap.put("title",title);
fvMap.put("introduction",introduction);
fvMap.put("description",description);
snv.setFvMap(fvMap);
HelpPlanDto helpPlan = null;
//使用工具類進行類型轉化:
DTOUtils<HelpPlanDto> dtoUtils = new DTOUtils<>();
try {
helpPlan = dtoUtils.snv2Dto(snv,HelpPlanDto.class);
} catch (Exception e) {
e.printStackTrace();
}
完成。