Java反射调用方法时出现IllegalArgumentException参数数量错误求助
问题解决思路
核心问题分析
你遇到的IllegalArgumentException是因为getMethods()会返回所有继承自父类(比如Object)的公共方法,比如equals(Object)、hashCode()、toString()这些方法中,有些需要传入参数,而你统一传null就会触发参数数量不匹配的错误。另外getMethods()返回的方法顺序没有官方定义,所以出现“逆向执行”只是返回顺序的问题,并非循环逻辑错误。
修复方案
1. 只调用当前类声明的公共方法
用getDeclaredMethods()替代getMethods(),这个方法只会返回当前类自己定义的所有方法(不管修饰符),然后再过滤出public的方法,就能避开Object类的继承方法。
2. 正确调用无参方法
对于无参方法,调用invoke时可以直接省略第二个参数,或者传入空数组new Object[0],不要传null——虽然invoke允许传null,但当方法需要参数时会直接报错,而我们已经过滤了无参方法,所以用无参数的调用更安全。
修改后的代码
调整后的loopBankDataClass方法
public static void loopBankDataClass() throws InvocationTargetException, IllegalAccessException { bankData bd = new bankData(); Class<?> getBankClass = bd.getClass(); // 获取当前类声明的所有方法 Method[] methods = getBankClass.getDeclaredMethods(); for (Method method : methods) { // 只处理public且无参数的方法 if (Modifier.isPublic(method.getModifiers()) && method.getParameterCount() == 0) { try { // 无参方法直接调用,省略第二个参数 method.invoke(bd); } catch (Exception ex) { ex.printStackTrace(); } } } }
同样的逻辑适配loopUserDataClass方法
public static void loopUserDataClass() throws InvocationTargetException, IllegalAccessException { userData us = new userData(); Class<?> getUserDataClass = us.getClass(); Method[] methods1 = getUserDataClass.getDeclaredMethods(); for (Method method : methods1) { if (Modifier.isPublic(method.getModifiers()) && method.getParameterCount() == 0) { method.invoke(us); } } }
额外说明
如果一定要用getMethods(),可以通过method.getDeclaringClass() == getBankClass来过滤掉继承的方法,但getDeclaredMethods()更直接。另外加上method.getParameterCount() == 0的判断,可以确保只调用无参方法,彻底避免参数不匹配的问题。
内容的提问来源于stack exchange,提问作者Mohamad Alzaim
相关产品推荐
相关产品推荐

