2014-10-17 1 views
2

Мне нужно получить уникальный идентификатор метода для использования в качестве ключа на HashMap.Как получить уникальный идентификатор метода?

Я пытаюсь сделать что-то с помощью stacktrace и reflection, а пользователь - подписи метода. Но проблема в том, что я не нашел способ получить полную подпись метода (чтобы избежать перегрузки методов).

Edited

Я хотел бы, что 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(); 
    } 
} 

Но проблема в том, что два метода, с этой стратегией, будет иметь тот же идентификатор.

Как я могу работать?

+0

Добавьте типы аргументов в свой идентификатор. – Simulant

+0

Мне нужен один синглтон. – GarouDan

ответ

3

Вы можете добавить + ":" + element.getLineNumber(), но вам все равно придется беспокоиться о случае, когда два перегруженных метода помещаются на одну длинную строку.

Рассматривая методы StackTraceElement, не представляется возможным получить уникальный идентификатор метода таким образом. Кроме того, код, по моему мнению, не очень читаем.

Я предлагаю вам попытаться быть более явным и сделать

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

или что-то подобное.

+0

Проблема с element.getLineNumber() заключается в том, что когда я использую другой метод, некоторые строки ниже в том же методе, я получаю другой ключ. Я оммитировал, и я тоже хотел бы использовать метод put. Может быть, мне нужно иметь более явное, но я бы хотел избежать этого, если это возможно. – GarouDan

+0

+1 вам также нужно обрабатывать, когда метод имеет несколько строк. –

+0

Я отредактирую, чтобы сделать более явным – GarouDan