java 8里 Method方法bug

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了java 8里 Method方法bug脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

在写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代码跟踪:

java 8里 Method方法bug

是一个seArchMethods的方法在查找,继续走

java 8里 Method方法bug

代码走到这里,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)

脚本宝典总结

以上是脚本宝典为你收集整理的java 8里 Method方法bug全部内容,希望文章能够帮你解决java 8里 Method方法bug所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。