Android反射调用字符串指定Activity方法报NoSuchMethodException如何解决
异常产生原因
本次NoSuchMethodException的直接原因是方法参数列表不匹配:
- 反射调用
getMethod()时,第二个参数传入了String.class,表示你要查找的是方法签名为somesome(String)的方法 - 但你实际定义的目标方法是无参的
somesome(),Java反射查找方法会严格匹配方法名+参数类型列表,二者不一致就会抛出该异常。
额外注意:你的目标方法是static静态方法,后续调用invoke()时第一个参数无需传入实例对象,否则也会触发异常。
修复方案
方案1:保持目标方法为无参设计(推荐,符合你当前的方法定义)
修改反射调用代码即可:
Method method = null; try { // getMethod第二个参数不传入String.class,匹配无参方法 method = Class.forName("com.lab.android.TabActivity").getMethod(item); // 静态方法invoke第一个参数传null即可,不需要传入实例 method.invoke(null); } catch (NoSuchMethodException e) { Log.e("DTAG","NoSuchMethodException "+e.getMessage()); e.printStackTrace(); } catch (ClassNotFoundException e) { Log.e("DTAG","ClassNotFoundException "+e.getMessage()); e.printStackTrace(); } catch (IllegalAccessException e) { Log.e("DTAG","IllegalAccessException "+e.getMessage()); e.printStackTrace(); } catch (InvocationTargetException e) { Log.e("DTAG","InvocationTargetException "+e.getMessage()); e.printStackTrace(); }
方案2:保持反射查找逻辑不变,修改目标方法定义
如果你确实需要给目标方法传入String类型参数,修改目标方法的参数列表即可:
public static void somesome(String param) { Log.d("DTAG","Great Success,传入参数:" + param); }
修改后调用invoke时传入对应参数即可:method.invoke(null, "你要传的字符串参数");
内容的提问来源于stack exchange,提问作者Dim
相关产品推荐
相关产品推荐

