这个问题从我我遇到这个异常说起:
Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at dao.Dao.getList(Dao.java:52)
at dao.CourseDao.getAllCourse(CourseDao.java:28)
at dao.CourseDao.main(CourseDao.java:33)
这个错误是参数类型匹配出现了错误,我们来看一下我们的Dao.java:52
public List<T> getList(String sql, Object...args) throws Exception {
List list = new ArrayList<>();
st = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
st.setObject(i + 1, args[i]);
}
ResultSet set = st.executeQuery();
while (set.next()) {
Object instance = null;
Field fields[] = clazz.getDeclaredFields();
instance = clazz.newInstance();
for (Field field : fields) {
String fieldName = field.getName();
StringBuilder fieldsb = new StringBuilder(fieldName);
int a = (int) fieldsb.charAt(0) - 32;
char ch = (char) a;
fieldsb.replace(0, 1, ch + "");
Method method = clazz.getMethod("set" + fieldsb, field.getType());
System.out.println(set.getObject(fieldName).getClass());
/*52*/ method.invoke(instance, set.getObject(fieldName));
}
list.add(instance);
}
return list;
}
错误出现在method.invoke()的时候,我们知道参数,一个是类的实体,另外的一个是实参
我们既然是报告了异常,看来我们实参和形参之间类型是不匹配的,当然类型不匹配是报了这样的一个异常,我检查了一下,发现我们实体类的形参:
public void setStartTime(java.sql.Date sdate)
{
this.startTime=sdate
}
datetime也就是说我从数据库里面将数据取出来的时候调用该方法出现了异常,可是我在向数据库里面存储时间的时也是用到的java.sql.Date
String starttime=request.getParameter("starttime");
Date dt=new Date();
SimpleDateFormat sft=new SimpleDateFormat("yyyy-MM-dd");
dt=sft.parse(starttime);
java.sql.Date sdate=new java.sql.Date(dt.getTime());
course.setStartTime(sdate);
System.out.println(sdate.getClass());
上面是我从表单中获取到数据,因为是一个字字符串,所以我用到了SimpleDateFormat这个类的parse函数有一个好处是可以将字符串解析成为java.util转换成为Date的一个对象,然后我们可以利用Date的一个方法获取到秒
dt.getTime(),然后java.sql又存在一个构造方法将long类型转化成为java.sql.Date,反正就是从表单中数据时间存储到数据时间所经历的一个路程,在数据库中我们时间的存储的方式是datetime,现在我需要将数据库中的的时间取出来出现了上面的异常
原因是因为我们从数据库中取出的时间是java.sql.Timestamp不是java.sql.date了,这个真心的好奇怪
那么我们在接受的时候是不能利用java.sql.date来进行接收了,这个是因为java中在参数传递的时候有三种形式,一种是
“刚刚好的传递”,也就是说形参的类型是int ,实参传递过来的还是int,形参和实参类型完全的相同
“收缩参数传递” 也就是我们上面出现的这样的情况了,两个参数不是一一对应的,尽管是相近的也不行
java.util.Date
|_ _java.sql.Date , java.sql.Timestamp
数据库中传递过来的数据类型是java.sql.Timestamp,使用java.sql.Date是无法进行接受的,尽管他们是拥有相同的父类
“扩展的参数传递”,上面遇到的问题我们的修改的办法是将实体类
public void setStartTime(java.sql.Date sdate)
{
this.startTime=sdate
}
startTime的参数类型改变一下,变成为java.util.Date就可以了
上面是我遇到的问题,和理解,希望对你有所帮助