2011-03-14 88 views
3

有沒有辦法獲得方法對象而無需使用方法名來獲取它?獲取方法對象而不用按名稱尋址方法

比如我有類:

class Car { 

    public String drive(); 
    public String giveUp(); 
    public String fillUp(); 
} 

我想創建的方法Map<String, Method>(又名:( 「移動」,驅動器()),( 「名」,giveUp()), ....)。

由於使用了混淆,我無法通過名稱獲取方法對象。有沒有辦法獲取方法名稱而不必綁定?

我想提出這個的另一種方式是:

對於你的getClass(),是有方法的等價類?我正在尋找giveUp.Method的特點。

+2

儘管我非常欣賞錯誤拼寫「混淆」的諷刺意味,但請注意不要生成錯誤拼寫的標籤,尤其是當您自動完成幫助時。 – skaffman 2011-03-14 20:27:17

+0

嘿,我責怪汽車完成那一個。 – monksy 2011-03-14 20:28:14

+1

嘿爲什麼不除了混淆的方法?即無論是通過名稱訪問方法還是混淆,您的兩個目標都不合並,並假裝他們通過解決問題來做是徒勞的。在最壞的情況下,創建一個if(key){//調用key的方法} else if(nextKey){...}。 – ThomasRS 2011-03-14 22:24:53

回答

3

您可以使用Reflection獲取所有方法。

Class<Car> clazz = Car.class; 
Method[] methods = clazz.getDeclaredMethods(); 

他們你遍歷方法並將其映射:

for(Method method: methods) 
    map.put(method.getName(), method); 
+0

我有一個特定的方法名稱,我不需要映射所有的方法。目標是讓map.get(「name」)。invoke(...)。由於混淆器的方法名稱會改變。 – monksy 2011-03-14 20:39:35

4

有沒有這樣的構造如在Java中Car.giveUp.method(),因爲方法不是「一等公民」像類和對象。

不知道混淆器對你的代碼做了什麼,或者添加了額外的信息,因爲除了它們的名字以外,它們具有相同的簽名。

  • 有些模糊處理產生的文本文件,原來的名稱映射到混淆的名稱,你可以使用該映射文件在運行時識別混淆的方法。

  • 你可以用自己編寫註釋@MappedMethodString類型的默認屬性的標註添加到方法,像

    @MappedMethod("move") 
    public String drive(); 
    

    。然後使用反射來獲取所有方法及其註釋,並將註釋值用作關鍵字。