学习java5个月了,拿来老师的通用的增删改查代码敲了一遍。写完后出现
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:498)
at com.sram.dao.imp.BaseDaoImpl.getPager(BaseDaoImpl.java:359)
at com.sram.test.MyTest.main(MyTest.java:14)
的异常。具体代码如下:
public List<T> getAllObjByList() {
//select * from tableName
String tableName = getCls().getSimpleName();
String sql = "select * from " + tableName;
System.out.println(sql);
try {
conn = JDBCUtil.getConnection();
state = conn.createStatement();
rs = state.executeQuery(sql);
List<T> list = new ArrayList<T>();
Field[] fields = getCls().getDeclaredFields();
//System.out.println(rs.next());
while(rs.next()){
@SuppressWarnings("unchecked")
T t = (T)getCls().newInstance();
for(Field field:fields){
String fieldName = field.getName();
//System.out.println(fieldName);
Object obj = rs.getObject(fieldName);
//System.out.println(obj);
String methodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
Method method = getCls().getMethod(methodName, field.getType());
method.invoke(t, obj);
}
list.add(t);
}
return list;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}finally{
JDBCUtil.close(rs);
JDBCUtil.close(state);
JDBCUtil.close(conn);
}
return null;
}
这段代码getCls()是本类写好的方法,用来获取调用者父类的泛型类(含包名),是通过反射获取泛型类的属性名,方法名,最终调用invoke方法将数据库中所有数据
存放入List集合中。
然而当 method.invoke(t, obj) 的时候总是报参数类型不匹配,最终通过排除法将异常范围锁定到数据库。
我使用的mysql数据库
在设计表的时候,给id设置了无符号类型
ALTER TABLE `student`
MODIFY COLUMN `id` int(20) UNSIGNED NOT NULL AUTO_INCREMENT FIRST ;
给id设置无符号类型将使invoke的基本数据类转换失败,不能将基本数据类型转换为Object类,导致的参数类型不匹配的异常
粗鄙之见,希望能帮到和我遇到一样错误的人
如果有错误,非常感谢您的指导。