第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

java 8里 Method方法bug

java 8里 Method方法bug

慕田峪7331174 2019-03-13 18:15:43
在寫(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_101Class.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)
查看完整描述

4 回答

?
HUWWW

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊

你的邏輯只匹配了方法名稱并沒(méi)有匹配參數(shù)類型吧。


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("找不到方法");

}

上面的代碼是樓主查詢的method的方式吧,我說(shuō)未匹配類型,是指樓主自己寫(xiě)的代碼中沒(méi)有匹配參數(shù)的類型。而jdk內(nèi)部是有這個(gè)判斷的。


public class Test {


    public String hello(int i) {

        return "Hello" + i;

    }


    public static void main(String[] args) {

        Test t = new Test();

        try {

            Method m = Test.class.getMethod("hello", Integer.class);

            System.out.println(m.invoke(t, 9));

        } catch (Exception e) {

            e.printStackTrace();

        }


        try {

            Method m = Test.class.getMethod("hello", int.class);

            System.out.println(m.invoke(t, 8));

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

我不太清楚樓主的代碼是如何編寫(xiě)的,不過(guò)這段代碼樓主可以運(yùn)行一下看看區(qū)別。


查看完整回答
反對(duì) 回復(fù) 2019-04-25
?
慕桂英3389331

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊

public static void main(String[] args) throws InvocationTargetException {

    try {

        Class<?> c = Class.forName("java.lang.StringBuilder");

        Object instance = c.newInstance();

        Method m = c.getMethod("append", String.class);

        Object o = m.invoke(instance, "Hello World");

        System.out.println(o);

    } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException e) {

        e.printStackTrace();

    }

}


我也是jdk1.8.0_101, 完全沒(méi)問(wèn)題啊


查看完整回答
反對(duì) 回復(fù) 2019-04-25
?
GCT1015

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊

The parameterTypes parameter is an array of Class objects that identify the method's formal parameter types, in declared order. If parameterTypes is null, it is treated as if it were an empty array.
api里面說(shuō)了,如果第二個(gè)參數(shù)不傳,會(huì)默認(rèn)空數(shù)組,也就是找入?yún)榭盏姆椒?,那肯定?huì)報(bào)‘找不到方法’的錯(cuò)了

查看完整回答
反對(duì) 回復(fù) 2019-04-25
  • 4 回答
  • 0 關(guān)注
  • 580 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)