java 8裡 Method方法bug

weixin_34127717發表於2016-10-12

在寫rpc框架的時候出現了頭疼問題:

 public Object invoke(Object bean)throws Exception {
            Method[] methods = clazz.getMethods();
            for (Method method:methods) {
                if(method.getName().equals(method.getName())){
                    return method.invoke(bean, param);
                }
            }
            throw new Exception("找不到方法");
        }

這樣寫能找到方法,沒有問題!!但是換成下面的方式就出問題了。

 public Object invoke(Object bean)throws Exception {
      return clazz.getMethod(method, param.getClass()).invoke(bean, param);
 }

跑出異常為:
java.lang.NoSuchMethodException:com.robin.interf.UserService.getUser(java.lang.Integer)

java使用的版本是:jdk1.8.0_101

Class.java程式碼跟蹤:
圖片描述

是一個searchMethods的方法在查詢,繼續走
圖片描述

程式碼走到這裡,res=null,導致NoSuchMethodException異常,算是java8 bug吧!

原因:searchMethods方法裡,m.getName() == internedName這句導致的,正確的是m.getName().intern() == internedName,因為m.getName()是堆裡取出值,而internedName是常量池裡的,而m.getName().intern()會將常量池裡存在的字串直接取到,不存在的會放入到常量池裡。

建議:建議使用class.getMethods(),然後我們自己遍歷,不推薦使用class.getMethod(methodName, paras)

相關文章