at sun.reflect.NativeMethodAccessorImpl.invoke0

         学习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 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 list = new ArrayList();
            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设置了无符号类型at sun.reflect.NativeMethodAccessorImpl.invoke0_第1张图片

  ALTER TABLE `student`
  MODIFY COLUMN `id`  int(20) UNSIGNED NOT NULL AUTO_INCREMENT FIRST ;

  给id设置无符号类型将使invoke的基本数据类转换失败,不能将基本数据类型转换为Object类,导致的参数类型不匹配的异常

                                                                                                                                                  粗鄙之见,希望能帮到和我遇到一样错误的人

                                                                                                                                                  如果有错误,非常感谢您的指导。





你可能感兴趣的:(at sun.reflect.NativeMethodAccessorImpl.invoke0)