2012-04-05 8 views
3

나는 저를 부르는 완전한 방법 서명을 얻는 방법을 찾고 있습니다. 예를 들어저에게 전화 한 어떤 방법을 찾으십시오

:

public class Called { 

    public void whoCallMe() { 
     System.out.println("Caller Method: " + new Throwable().getStackTrace()[1].getMethodName()); 
    } 
} 

public class Caller { 

public static void run(int i) { 
    new Called().whoCallMe(); 
} 

public static void run(String str) { 
    new Called().whoCallMe(); 
} 

public static void run(boolean b) { 
    new Called().whoCallMe(); 
} 

/** MAIN **/ 
public static void main(String[] args) { 
    run("hi"); 
} 

내가 그 실행 방법이라고하지만 3 과부하 이후 발신자 원인이었다 하나 말할 수 없다 볼 수 있습니다 내가 whoCallMe() 메소드를 구현 한 방법 whoCallme 메서드 이름으로 "run"만 반환합니다.

여러분은 run (java.lang.String)과 같은 완전한 메소드 서명을 얻을 수있는 다른 방법을 알고 계십니까?

+0

디버깅 API가 필요합니다. 바이트 코드 도구를 사용하여 줄 번호를 기반으로 메서드를 찾을 수도 있습니다. – biziclop

+0

왜이 작업을 수행해야합니까? – Jeffrey

+0

아마도 도움이 될 수 있습니다. http://stackoverflow.com/questions/421280/in-java-how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection – SWoeste

답변

1

AspectJ를 사용하여 모든 메소드 호출에 적용 할 애스펙트를 생성하고 호출되는 메소드에 대한 세부 정보를 스레드 별 스택에 추가 한 다음 메소드가 완료된 후이를 제거 할 수 있습니다. 물론 미친 듯이 비쌀 것입니다. 가장 가능성이 높습니다. 또한 누가 당신에게 전화했는지 알아 내기 위해 무엇이라도 던지기를 원하지 않습니다.

기본적으로 귀하의 질문에 대한 답변은 :하지 마십시오. 왜 당신이 그것을하고 싶어하는지 설명하고 누군가가 당신에게 좋은 대안을 줄 것이라고 설명하십시오.

또한 생각해 보니, 오버로드 (오버라이드하지 않음!)가 유해한 것으로 간주 될 수 있다고 주장 할 수 있습니다. 다른 인수와 이름을 가진 여러 가지 다른 메소드가 정말로 필요합니까?

+0

+ 1에 대한 조언이 필요하지 않습니다. _ –

+0

의견이 없으면 하회합니다. 무례합니다. –

+0

좋아, 내가 왜 호출자가 하나인지 알아야 할 필요가 더 나은 이유를 설명하자 : 내가 처리의 특정 시간에서 retrive 필요 몇 가지 정보와 함께 모든 메서드를 주석 있다고 가정 해. 내가 run() cod = 1 및 run (String arg) cod = 2로 주석을 달았습니다.이 경우 호출자로 run (String)과 실행을 구분할 수 없기 때문에 어떤 코드 값을 사용해야하는지 알 수 있습니까? 나는 그런 일을하도록 사용자를 속일 수는 없다. (그것은 우리가 내 작업에서 가지고있는 틀의 일부이다.) 나는 모든 sugestions/help까지 지금까지 apreciated했다. 고마워. – RLM

관련 문제