클래스가 Java에서 리플렉션을 통해 갖는 내부 클래스를 알 수있는 방법이 있습니까?Java에서 Reflection을 통해 InnerClasses 목록을 가져 오는 방법이 있습니까?
답변
예,이 경우 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을 보는 것은, 당신이 명시 적으로 요구하고 생각하지 않는다 그들.
아니, 불행하게도, 당신이 enumerate regular classes in a package.
내부 클래스는 정말 런타임에 단지 일반적인 클래스입니다 수없는 이유 같은 이유. 컴파일러는 일반적인 액세스 규칙을 해결하기 위해 몇 가지 조정을 수행합니다. 예를 들어, 내부 클래스는 포함하는 클래스의 private 필드와 메서드에 액세스 할 수있는 것처럼 보입니다. 컴파일러가 비공개 접근 자 함수를 만듭니다. 내부 클래스에서 사용됩니다. 자세한 내용은 Java in a Nutshell - how inner classes work을 참조하십시오.
내부 클래스는 정규 클래스이며 신뢰할 수 있도록 열거 할 수 없으므로 일반적인 대답은 불가능합니다.
그러나 특정 경우에 해결할 수 있습니다. 사용중인 JAR을 알고있는 경우 JAR의 모든 파일을 반복하여 패턴 yourpakage.YourClass$<something>.class
의 파일을 찾고 <something>
은 하나 이상의 문자입니다.
편집 : 내부 클래스의 다양한 종류가 있습니다 : 이러한 인터페이스와 클래스
로
- 회원들에게 선언은, 첫 번째 경우,
getDeclaredClasses
을 사용한 BalusC의 대답이 올바른 것입니다. 모두 내부 클래스가 필요하면getDeclaredClasses
은 불행히도 작동하지 않습니다. SDN Bug 4191731을 참조하십시오. 이 경우 링크 (JAR 파일 검색과 같은)에서 제안 된 클래스 enumeation 메소드 중 하나를 시도해 볼 수 있습니다.
예, 그렇게하는 것이 트릭입니다. locating resources에 대한 이전 게시물을 참조하십시오. 클래스를 알면 (com.domain.api.ClassA라고 가정 해 봅시다), 패키지 이름을 추출하고 패키지를 경로로 변환하고 ('.'를 '/'로 바꾸면 com/domain/api가됩니다) 모든 파일을 검사합니다. extension .class를 클래스 이름 (ClassA $ xxxxx)으로 시작하는 파일 만 보유하면 ClassA 클래스의 내부 클래스가됩니다.
- 1. Java에서 현재 프레임에 대한 참조를 가져 오는 방법이 있습니까?
- 2. Java에서 입력하지 않고 키보드에서 문자를 가져 오는 쉬운 방법이 있습니까?
- 3. Java에서 표시 이름이 지정된 Locale을 가져 오는 방법이 있습니까?
- 4. 실행중인 응용 프로그램 목록을 가져 오는 플랫폼 간 방법이 있습니까?
- 5. 설치된 모든 iPhone 앱 목록을 가져 오는 방법이 있습니까?
- 6. iPhone 응용 프로그램의 모든 클래스 목록을 가져 오는 방법이 있습니까?
- 7. 리플렉션을 통해 유형의 별칭을 가져 오는 방법이 있습니까?
- 8. 형식을 통해 벡터의 바이트 크기를 가져 오는 방법이 있습니까?
- 9. Reflection을 통해 어셈블리 주석을 가져올 수 있습니까?
- 10. ClassLoader가로드 한 클래스를 가져 오는 방법이 있습니까?
- 11. SQLite로 데이터를 가져 오는 쉬운 방법이 있습니까?
- 12. iCal 파일을 FullCalendar로 가져 오는 방법이 있습니까?
- 13. 대기열의 마지막 요소를 가져 오는 방법이 있습니까?
- 14. HashSet의 현재 용량을 가져 오는 방법이 있습니까?
- 15. div의 스타일 속성을 가져 오는 방법이 있습니까?
- 16. 등록 주소를 가져 오는 방법이 있습니까?
- 17. 스크롤바 높이와 너비를 가져 오는 방법이 있습니까?
- 18. UILabel 텍스트의 shadowPath를 가져 오는 방법이 있습니까?
- 19. DOMElement의 모든 속성을 가져 오는 방법이 있습니까?
- 20. Open Graph에서 데이터를 가져 오는 방법이 있습니까?
- 21. 버즈에서 댓글을 가져 오는 방법이 있습니까?
- 22. $ .ajax의 기본 객체를 가져 오는 방법이 있습니까
- 23. 텍스트가없는 UIDatePickerView를 가져 오는 방법이 있습니까?
- 24. SWT를 통해 작업 관리자 목록을 가져 옵니까?
- 25. Android 앱에서 웹보기에서 HTML을 가져 오는 방법이 있습니까?
- 26. 링크에서 쿼리 문자열 목록을 가져 오는 ASP.Net
- 27. LAN에서 IP 주소 목록을 가져 오는 방법은 무엇입니까?
- 28. Java에서 request.getSession()을 호출하는 세션을 가져 오는 방법은 하나만 있습니까?
- 29. AtomPub을 사용하여 WordPress 블로그에서 기존 태그 목록을 가져 오는 방법이 있습니까?
- 30. TFS API - 작업 항목 유형에 대한 전환 목록을 가져 오는 방법이 있습니까?
"익명 클래스"와 혼동 스럽습니다. – BalusC
@BalusC 기술적으로 익명 인 클래스는 내부 클래스입니다. :) – cletus