java 反射调用set方法_java反射调用set方法时如果让参数做自动类型转换

本文探讨了在Java中使用反射调用set方法时遇到的自动类型转换问题。通过一个具体的例子展示了如何遍历Map并利用反射填充BO属性。在实际操作中遇到了将String类型的值转换为int类型以匹配set方法的参数时抛出的`IllegalArgumentException`。文章询问如何在反射调用方法时实现自动类型转换。
摘要由CSDN通过智能技术生成

这段时间学习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 {

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 studentMap = new LinkedHashMap();

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 studentEntityUtil = new Excle2EntityUtil(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类型转换为所需要的类型呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值