2014-10-17 64 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