这段时间学习java的反射机制想实现一个功能:遍历一个Map,然后利用反射机制调用BO的set方法,完成BO属性的自动注入。这样设计的初衷是解决Excel数据导入问题中的Map数据填充BO这一过程。
下面是一个BO:
package com.handlewell.testOnly.persistence; import java.io.Serializable; import java.util.Date; public class StudentBO implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private Long id; private String sname; private Integer age; private Date birthDate; public Long getId() { return id; } public void setId(Long id) { this.id = id; } . . . }
为了代码的复用性和做Excel文件处理时的灵活性决定使用Enum来指定文件中表头和BO中属性方法的对应关系,下面是使用的Enum类:
public enum ExclTableField { Sname("姓名"), Age("年龄"), BirthDate("生日"); private String description; private ExclTableField(String description){ this.description = description; } public String getDescription() { return description; } }
有了BO和Enum我们需要一个工具类来完成数据的填充,这个工具类必须能完成各种BO的填充,所以必须使用泛型和反射。
下面是工具类的代码:
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Excle2EntityUtil<T> { private T entity; public Excle2EntityUtil(T entity){ this.entity = entity; } public void doInitEntity(String methodName , Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{ //根据传入的属性名称构造属性的set方法名 methodName = "set"+methodName; System.out.println("Method Name --"+methodName); Method[] methods = entity.getClass().getMethods(); for(Method method:methods){ //如果方法同名则执行该方法(不能用于BO中有重载方法的情况) if(methodName.equals(method.getName())){ //这里如何做类型转换???????????* method.invoke(entity, obj); } } } }
在做测试的时候因从模拟的数据Map中得到的Age是一个String类型的,在反射的方法调用时这个set方法应该传入的是int类型的数据。所以会抛出java.lang.IllegalArgumentException: argument type mismatch这样的异常。
package com.handlewell.testOnly.services.impl; import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; import com.handlewell.testOnly.persistence.StudentBO; import com.handlewell.testOnly.support.ExclTableField; import com.handlewell.testOnly.support.Excle2EntityUtil; public class InvokeMethodTest { public static void main(String[] args) { /**测试,手动构造一个Map,模拟从Excel中读出的数据Map----begin*/ Map<String, Object> studentMap = new LinkedHashMap<String, Object>(); studentMap.put("姓名", "gaojun"); String age = "24"; studentMap.put("年龄", age); Date date = new Date(); studentMap.put("生日", date); /**测试,手动构造一个Map,模拟从Excel中读出的数据Map----end*/ StudentBO student = new StudentBO(); //使用StudentBO构造一个数据填充工具实例 Excle2EntityUtil<StudentBO> studentEntityUtil = new Excle2EntityUtil<StudentBO>(student); for (ExclTableField tableField : ExclTableField.values()) { //根据Enum上属性名称拿到属性的值,这里所有的属性值都是一个Object类型。 Object obj = studentMap.get(tableField.getDescription()); try { //传入属性名和值,完成自动填充BO属性。 studentEntityUtil.doInitEntity(tableField.toString(), obj); } catch (Exception e) { e.printStackTrace(); } } System.out.println(student.getSname()); System.out.println(student.getAge()); System.out.println(student.getBirthDate()); } }
请问:这里要如何解决这个类型转换的问题呢?有没有什么方法可以让方法在执行时自动将Object类型转换为所需要的类型呢?