摘要:在寫(xiě)框架的時(shí)候出現(xiàn)了頭疼問(wèn)題找不到方法這樣寫(xiě)能找到方法,沒(méi)有問(wèn)題但是換成下面的方式就出問(wèn)題了。建議建議使用然后我們自己遍歷,不推薦使用
在寫(xiě)rpc框架的時(shí)候出現(xiàn)了頭疼問(wèn)題:
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("找不到方法"); }
這樣寫(xiě)能找到方法,沒(méi)有問(wèn)題!!但是換成下面的方式就出問(wèn)題了。
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代碼跟蹤:
是一個(gè)searchMethods的方法在查找,繼續(xù)走
代碼走到這里,res=null,導(dǎo)致NoSuchMethodException異常,算是java8 bug吧!
原因:searchMethods方法里,m.getName() == internedName這句導(dǎo)致的,正確的是m.getName().intern() == internedName,因?yàn)閙.getName()是堆里取出值,而internedName是常量池里的,而m.getName().intern()會(huì)將常量池里存在的字符串直接取到,不存在的會(huì)放入到常量池里。
建議:建議使用class.getMethods(),然后我們自己遍歷,不推薦使用class.getMethod(methodName, paras)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66123.html
摘要:服務(wù)本身是一個(gè),開(kāi)起的線(xiàn)程數(shù)為,再加上一些其他線(xiàn)程,總的線(xiàn)程數(shù)不會(huì)超過(guò)服務(wù)內(nèi)自己沒(méi)有顯示創(chuàng)建線(xiàn)程或者使用線(xiàn)程池。問(wèn)題解決找到所在后,結(jié)局方案很簡(jiǎn)單,只需將的通過(guò)單例的方式注入到服務(wù)中,即可解決堆外內(nèi)存泄漏的問(wèn)題。 內(nèi)存泄漏Bug現(xiàn)場(chǎng) 一個(gè)做BI數(shù)據(jù)展示的服務(wù)在一個(gè)晚上重啟了5次,由于是通過(guò)k8s容器編排,服務(wù)掛了以后會(huì)自動(dòng)重啟,所以服務(wù)還能繼續(xù)提供服務(wù)。 第一時(shí)間先上日志系統(tǒng)查看錯(cuò)誤日...
閱讀 2895·2023-04-26 02:49
閱讀 3461·2021-11-25 09:43
閱讀 3438·2021-10-09 09:43
閱讀 3020·2021-09-28 09:44
閱讀 2461·2021-09-22 15:29
閱讀 4538·2021-09-14 18:02
閱讀 2794·2021-09-03 10:48
閱讀 3439·2019-08-30 12:47