A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

看如下程序:
  1. public static void main(String[] args) {
  2. ArrayList<Integer> list = new ArrayList<Integer>();
  3. try {
  4. Method addMethod=list.getClass().getMethod("add", Object.class);
  5. //这里要传入String类型,为什么只能是Object.class,而用String.class会报告NoSuchMethodException
  6. addMethod.invoke(list, "nihao");
  7. System.out.println(list.get(0));
  8. } catch (NoSuchMethodException e) {
  9. e.printStackTrace();
  10. } catch (SecurityException e) {
  11. e.printStackTrace();
  12. } catch (IllegalAccessException e) {
  13. e.printStackTrace();
  14. } catch (IllegalArgumentException e) {
  15. e.printStackTrace();
  16. } catch (InvocationTargetException e) {
  17. e.printStackTrace();
  18. }
  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
本帖最后由 许庭洲 于 2012-8-30 09:36 编辑

1. 用ArrayList的麻烦的地方,数据放进去就不知道是什么类型了;
2. 用ArrayList不能防止非法类型数据的放入;
3. 最好用Object.class,因为Object是所有类的父类,而用String.class会报告NoSuchMethodException异常。
回复 使用道具 举报
不错 很详细了。。
回复 使用道具 举报
有木有更好的答案?既然第二个参数的意思是“调用方法包含的参数类型列表”,我的add就要加入String类型的,为什么不能直接写String.class?
回复 使用道具 举报
NoSuchMethodException的意思是,没有这个方法。。
  1. public Method getMethod(String name, Class<?>... parameterTypes)
  2.         throws NoSuchMethodException, SecurityException {
  3.         // be very careful not to change the stack depth of this
  4.         // checkMemberAccess call for security reasons
  5.         // see java.lang.SecurityManager.checkMemberAccess
  6.         checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader());
  7.         Method method = getMethod0(name, parameterTypes);
  8.         if (method == null) {
  9.             throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
  10.         }
  11.         return method;
  12.     }
复制代码
你调用的这个方法,Method method = getMethod0(name, parameterTypes);是这样获取的,错误在于第二个参数,第二个参数限定了参数类型,Object和String肯定有区别。
我只能这么理解了。。
回复 使用道具 举报
沙发,我也不懂,求解释!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马