2009-07-01 5 views
4

가능한 중복 :
Getting the class name from a static method in Java정적 메서드에서 클래스 이름을 가져올 수 있습니까?

정적 방법의 내부에, 클래스 이름을 입력하지 않고 클래스 이름 (이름을 포함하는 문자열)을 얻을 수있는 방법이있다 그 자체?

예를 들어, MyClass.class.getName()을 입력하면 단지 "Myclass"보다 유용하지 않습니다.

+0

정적 메소드는 선언 된 클래스와 만 연관되어 있습니다. 클래스를 명시 적으로 이름으로 참조하는 것 이외에 클래스에 액세스하는 방법이 있습니다. –

답변

11

새 예외를 생성하고 (던지지 않음) 스택 추적을 검사하여 수행 할 수 있습니다. 클래스는 Exception의 원점이므로 0 번째 요소가됩니다. 다소 틀린 느낌이지만 작동 할 것입니다.

System.out.println(new Exception().getStackTrace()[0].getClassName()); 

Thread 클래스에서도 동일한 작업을 수행 할 수 있습니다. 이것은 나에게 깨끗해 보이지만 라인은 약간 더 길다. 이제 클래스가 스택 추적에서 0이 아닌 첫 번째 요소가됩니다. Thread.getStackTrace()는 0입니다.

예를 들어
System.out.println(Thread.currentThread().getStackTrace()[1].getClassName()); 

, MyClass.class.getName를 입력()는 그냥 "MyClass에"보다 더 유용하지 않습니다.

반대로 IDE의 리펙터 기능을 사용하여 MyClass의 이름을 바꾸면 MyClass.class.getName()을 RenamedClass.class.getName()으로 바꿉니다. 문자열을 입력하면 수동으로해야합니다.

+0

오 ... 확인. 더 안전한 방법이지만 클래스 이름을 입력해야합니다. 그게 제가 피 하려던 것입니다. –

+0

당신의 대답과 다른 사람들의 말에 따르면, 언어가이 일을 할 수있는 깨끗한 방법을 제공하지 않는다는 것을 알기 때문에 클래스 네임을 입력하는 몇 가지 단점을 고려해 볼 때 그와 같은 추한 문장을 입력하는 것은 가치가 없다고 생각하지 않습니다 (주로 중복) . –

13

당신은 익명의 내부 클래스를 사용할 수는 타이핑을 저장의 문제의 경우

class Test { 
    public static void main(String[] args) { 
    String className = new Object(){}.getClass().getEnclosingClass().getName(); 
    System.out.println(className); 
    } 
} 
1

을하고 그것에 대해 생각하지 않습니다. MyClass.class를 사용하면 모든 리펙토링 도구가 코드를 인식하고 올바르게 작동 할 수 있습니다.

Java로 프로그램을 선택하면 많이 입력하게됩니다. 꽤 많은 타입을 입력 할 필요가 없도록 도와 줄 IDE를 사용하십시오.

관련 문제