2011-04-14 39 views
1

沿的線,所以,我已經得到的東西:NoSuchMethodException問題與反思

public abstract class myClass { 
    String myString; 
    int test; 

    public myClass(String heuristic) { 
    mystring = heuristic; 
    test = heuristicSwitch(); 
    } 

    public int heuristicSwitch() { 
    int hTest = 0; 

    try { 
     String methodName = "getHeuristic" + myString; 
     Method actionMethod = myClass.class.getDeclaredMethod(methodName); 
     hTest = (Integer)actionMethod.invoke(this); 
    } 
    catch(Exception e) { 
    } 

    return hTest; 
    } 

    public int getHeuristicManhattan() { 
    return 100; 
    } 

}

我難倒...我不斷收到NoSuchMethodException,但我不知道爲什麼。我認爲這個問題可能是因爲myClass是抽象的,所以我嘗試了getClass()並且有相同的異常,所以我認爲它是別的東西(除非這找不到超類方法?)。思考?

回答

3

嘗試使用getMethod()而不是getDeclaredMethod。前者將您限制爲特定的類實例,後者包含整個層次結構。另外,我假設啓發式(例如「曼哈頓」)是適當的大寫?

說,像這樣的東西可能通過使用枚舉和某種內部策略類更好地處理。你然後將你的枚舉映射到相關的策略實現。

+0

這樣做,謝謝!我會盡快投票。 – bendicott 2011-04-14 18:05:58

0

我覺得應該是:

String methodName = "getHeuristic" + mystring;

但我不知道你怎麼編譯。那裏的變量「啓發式」是什麼?

+0

哎呀,謝謝你。 – bendicott 2011-04-14 18:03:33

+0

np :)順便說一句,我想這不會編譯,如果你在任何地方使用'私人'領域,這通常是很好的做法。 – 2011-04-14 18:04:38

0

我建議你使用像commons-beanutils這樣的庫,而不是直接反射的不愉快。

此外,您的示例代碼有一個空的catch塊,這是最好的避免。

0

我認爲問題在於你是可變的myString沒有設置它應該是什麼。我會插入一些調試語句,以確保methodName正是你認爲它應該是。