博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 8里 Method方法bug
阅读量:7257 次
发布时间:2019-06-29

本文共 996 字,大约阅读时间需要 3 分钟。

在写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)

转载地址:http://mjvdm.baihongyu.com/

你可能感兴趣的文章
11-散列1 电话聊天狂人
查看>>
学SEO你其实只需要半个钟
查看>>
3G网卡PPP拨号
查看>>
AS3.0中的反射概念
查看>>
UIViewController中各方法调用顺序及功能详解
查看>>
C++ do{...}while(0)的好处
查看>>
【Todo】Python字符编码学习
查看>>
python实现朴素贝叶斯
查看>>
Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
查看>>
Java操作MongoDB:连接&增&删&改&查
查看>>
Maven使用
查看>>
用python脚本把windows的文件上传到linux中
查看>>
m_Orchestrate learning system---三十四、使用重定义了$的插件的时候最容易出现的问题是什么...
查看>>
打开居中显示的窗口
查看>>
thinkphp多层volist实现多表查询
查看>>
TextView实现跑马灯效果
查看>>
使用ivim配置vim
查看>>
网络对抗作业 一
查看>>
用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码
查看>>
PHP性能优化
查看>>