2014-10-17 4 views
2

HashMap에서 키로 사용할 고유 한 메서드 식별자를 가져와야합니다.고유 한 메소드 식별자를 얻는 방법?

stacktrace 및 리플렉션 및 사용자에게 메소드 서명을 사용하여 작업을 수행하려고합니다. 그러나 문제는 메서드 오버로드를 피하기 위해 전체 메서드 시그니처를 검색하는 방법을 찾지 못했기 때문입니다.

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를해야합니다, 두 가지 방법입니다 :

편집

는이 작품처럼 그 somethink을하고 싶습니다.

어떻게 해결할 수 있습니까?

+0

사용자 ID에 인수 유형을 추가하십시오. – Simulant

+0

나는 일종의 싱글 톤이 필요하다. – GarouDan

답변

3

+ ":" + element.getLineNumber()을 추가 할 수는 있지만 두 개의 오버로드 된 메소드가 하나의 긴 행에 삽입되는 경우에는 여전히 걱정해야합니다.

StackTraceElement 메서드를 보면 고유 한 메서드 식별자를 이런 식으로 얻을 수없는 것처럼 보입니다. 게다가,이 코드는 제 의견으로는별로 읽을 수 없습니다.

난 당신이 더 명시 적으로 시도하고 유사한

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

또는 무언가를 건의 할 것입니다.

+0

element.getLineNumber() 문제는 동일한 메서드에서 다른 메서드를 사용하여 다른 키를 얻을 때 발생합니다. 나는 생략했다. put 메소드도 사용하고 싶다. 어쩌면 나는 더 명시 적으로 할 필요가 있지만 가능하다면 이것을 피하고 싶습니다. – GarouDan

+0

+1 메서드에 여러 줄이있는 경우에도 처리해야합니다. –

+0

더 명시 적으로 편집합니다. – GarouDan

관련 문제