优艾设计网

java 8里 Method方法bug?

优艾设计网 https://www.uibq.com 2023-06-22 07:44 出处:网络 作者:电脑技术
在写rpc框架的时候出现了头疼问题: public Object invoke(Object bean)throws Exception { Method[] methods = clazz.getMethods(); for (Method method:methods) { if(method.getName().equals(method.getName()))

在写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(me优艾设计网_设计客thodName, paras)


what163` 优艾设计网_PS交流 12小时前

你的逻辑只匹配了方法名称并没有匹配参数类型吧。


0

精彩评论

暂无评论...
验证码 换一张
取 消