2014-10-17 30 views
2

我需要獲得一個唯一的方法標識符用作HashMap上的一個鍵。如何獲取唯一的方法標識符?

我想做一些使用堆棧跟蹤和反射和用戶的方法簽名。但問題是我沒有找到一種方法來檢索完整的方法簽名(以避免方法超載)。

編輯

我想這somethink像這樣工作的:

public class Class1 { 

    HashMap<String, Object> hm; 

    public Class1() { 
     hm = new HashMap<String, Object>(); 
    } 

    public Object method() { 
     if (!containsKey()) { 
      Object value; 
      ... 
      put(value); 
     } 

     return get(); 
    } 

    public Object method(String arg1) { 
     if (!containsKey()) { 
      Object value; 
      ... 
      put(value); 
     } 

     return get(); 
    } 

    public Boolean containsKey() { 
     if (hm.containsKey(Util.getUniqueID(2)) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public void put(Object value) { 
     hm.put(Util.getUniqueID(2), value); 
    } 

    public Object get() { 
     String key = Util.getUniqueID(2); 
     if (hm.containsKey(key) { 
      return hm.get(key); 
     } else { 
      return null; 
     } 
    } 
} 

class Util { 
    public static String getUniqueID(Integer depth) { 
     StackTraceElement element = Thread.currentThread().getStackTrace()[depth]; 
     return element.getClassName() + ":" + element.getMethodName(); 
    } 
} 

但問題是這兩種方式,這一戰略,將具有相同的ID。

我該如何解決?

+0

將參數的類型添加到您的ID。 – Simulant 2014-10-17 12:33:10

+0

我需要一種單身人士。 – GarouDan 2014-10-17 12:43:55

回答

3

你可以附加+ ":" + element.getLineNumber()但你仍然需要擔心兩個重載方法放在一條長線上的情況。

看看StackTraceElement方法,似乎不可能以這種方式獲得唯一的方法標識符。此外,我認爲這些代碼不太可讀。

我建議你嘗試更明確,做

if (hm.containsKey("getValue(int)") { 
    ... 
} 

或類似的東西。

+0

element.getLineNumber()的問題是當我在同一個方法中使用另一個方法的一些行時,我得到另一個鍵。我已經忘記了,我也想使用put方法。也許我需要更加明確,但是我想避免這種情況,如果可能的話。 – GarouDan 2014-10-17 12:37:43

+0

+1您還需要處理方法有多行時。 – 2014-10-17 12:37:48

+0

我會編輯以更明確 – GarouDan 2014-10-17 12:38:42