2008-11-12 4 views
8

난과 같이, 정적 방법으로 자바 클래스가 있다고 가정하자 :내 정적 메서드를 호출 한 클래스는 무엇입니까?

 
class B extends A { } 
class C extends A { } 
class D extends A { } 
... 

이제 다음과 같은 메소드 호출을 고려 :

 
class A 
{ 
    static void foo() 
    { 
     // Which class invoked me? 
    } 
} 

그리고 가정 더 클래스 A는 서브 클래스의 임의의 번호를 가지고 :

 
A.foo(); 
B.foo(); 
C.foo(); 
D.foo(); 
... 

제 질문은 어떻게 호출 할 수 있나요?

답변

10

정적 메서드에서 문제가 될 수 없습니다. 컴파일러에 관한 한 A.foo()B.foo()은 완전히 똑같습니다. 실제로 동일한 바이트 코드로 컴파일됩니다. 그것보다 더 유사 할 수는 없습니다.

이런 종류의 정보가 필요한 경우 싱글 톤을 사용하고 foo()을 인스턴스 메소드로 변환하십시오. 여전히 정적 구문이 마음에 들면, 외관 A.foo()을 만들 수 있습니다.

static void foo() 
{ 
    Throwable t = new Throwable(); 
    StackTraceElement[] trace = t.getStackTrace(); 
    String className = trace[1].getClassName(); 
    Class whoCalledMe = null; 
    try 
    { 
     whoCalledMe = Class.forName(className); 
    } 
    catch(Exception e) 
    { 
    } 
} 

I : 당신이 정적 메소드가 에 호출 된 클래스를 찾을 수는 없지만

3
class A 
{ 
    static void foo(A whoIsCalingMe) 
    { 
     // Which class invoked me? 
    } 
} 
4

, 실제로 런타임에 메서드 호출하는 클래스를 찾을 수 있습니다 이것이 좋은 실천이고 성과 측면에서도 좋지는 않다고 말하는 것은 아니지만 효과가있을 것입니다. 그것이 당신을 도울 지 모른다면 ...

+0

헉. 그것은 작동합니다. 그러나 IIRC의 반성은 의도적으로 이러한 종류의 것들을 방해하기 위해 추악하게 만들어졌습니다. – jamesh

+0

Foo 클래스의 메소드가'trace ("hi")'를 호출하면 정적 유틸리티 메소드'trace (String s)'를 작성하여 SYSOUT에 쓸 수있는 방법을 찾고있었습니다. ** Foo : hi **. 이것은 트릭을 수행하는 것으로 보입니다. – Chap

관련 문제