摘要:在写框架的时候出现了头疼问题找不到方法这样写能找到方法,没有问题但是换成下面的方式就出问题了。建议建议使用然后我们自己遍历,不推荐使用
在写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)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/66123.html
摘要:服务本身是一个,开起的线程数为,再加上一些其他线程,总的线程数不会超过服务内自己没有显示创建线程或者使用线程池。问题解决找到所在后,结局方案很简单,只需将的通过单例的方式注入到服务中,即可解决堆外内存泄漏的问题。 内存泄漏Bug现场 一个做BI数据展示的服务在一个晚上重启了5次,由于是通过k8s容器编排,服务挂了以后会自动重启,所以服务还能继续提供服务。 第一时间先上日志系统查看错误日...
阅读 2860·2023-04-26 02:49
阅读 3442·2021-11-25 09:43
阅读 3378·2021-10-09 09:43
阅读 2990·2021-09-28 09:44
阅读 2447·2021-09-22 15:29
阅读 4510·2021-09-14 18:02
阅读 2776·2021-09-03 10:48
阅读 3429·2019-08-30 12:47