2010-05-02 3 views

답변

6

예,이 경우 Class#getDeclaredClasses()을 사용하십시오. 수정자를 검사하여 내부 클래스인지 또는 중첩 (정적) 클래스인지 확인해야합니다. 부모 클래스가 Parent 즉 가정하면, 여기에 킥오프 예제 :

for (Class<?> cls : Parent.class.getDeclaredClasses()) { 
    if (!Modifier.isStatic(cls.getModifiers())) { 
     // This is an inner class. Do your thing here. 
    } else { 
     // This is a nested class. Not sure if you're interested in this. 
    } 
} 

참고 :이 익명 클래스를 다루지는 않지만 주제에 your previous question을 보는 것은, 당신이 명시 적으로 요구하고 생각하지 않는다 그들.

0

아니, 불행하게도, 당신이 enumerate regular classes in a package.

내부 클래스는 정말 런타임에 단지 일반적인 클래스입니다 수없는 이유 같은 이유. 컴파일러는 일반적인 액세스 규칙을 해결하기 위해 몇 가지 조정을 수행합니다. 예를 들어, 내부 클래스는 포함하는 클래스의 private 필드와 메서드에 액세스 할 수있는 것처럼 보입니다. 컴파일러가 비공개 접근 자 함수를 만듭니다. 내부 클래스에서 사용됩니다. 자세한 내용은 Java in a Nutshell - how inner classes work을 참조하십시오.

내부 클래스는 정규 클래스이며 신뢰할 수 있도록 열거 할 수 없으므로 일반적인 대답은 불가능합니다.

그러나 특정 경우에 해결할 수 있습니다. 사용중인 JAR을 알고있는 경우 JAR의 모든 파일을 반복하여 패턴 yourpakage.YourClass$<something>.class의 파일을 찾고 <something>은 하나 이상의 문자입니다.

편집 : 내부 클래스의 다양한 종류가 있습니다 : 이러한 인터페이스와 클래스

  • 익명 클래스와 로컬 클래스 만 걱정하면
    1. 회원들에게 선언은, 첫 번째 경우, getDeclaredClasses을 사용한 BalusC의 대답이 올바른 것입니다. 모두 내부 클래스가 필요하면 getDeclaredClasses은 불행히도 작동하지 않습니다. SDN Bug 4191731을 참조하십시오. 이 경우 링크 (JAR 파일 검색과 같은)에서 제안 된 클래스 enumeation 메소드 중 하나를 시도해 볼 수 있습니다.

    +0

    "익명 클래스"와 혼동 스럽습니다. – BalusC

    +0

    @BalusC 기술적으로 익명 인 클래스는 내부 클래스입니다. :) – cletus

    0

    예, 그렇게하는 것이 트릭입니다. locating resources에 대한 이전 게시물을 참조하십시오. 클래스를 알면 (com.domain.api.ClassA라고 가정 해 봅시다), 패키지 이름을 추출하고 패키지를 경로로 변환하고 ('.'를 '/'로 바꾸면 com/domain/api가됩니다) 모든 파일을 검사합니다. extension .class를 클래스 이름 (ClassA $ xxxxx)으로 시작하는 파일 만 보유하면 ClassA 클래스의 내부 클래스가됩니다.

    관련 문제