아니요, 완전히 신뢰할 수있는 방법은 아닙니다. 그러나 많은 경우에 구현하는 것이 현실적 일 수 있습니다.
Java 클래스 로더의 유연성 때문에 특정 패키지에서 정의 된 클래스는 런타임에 알 수 없을 수도 있습니다 (예 : 네트워크에서 클래스를로드하는 등의 방식으로 클래스를 즉석에서 정의하는 특수 클래스 로더를 고려하거나 ad-hoc으로 컴파일). 따라서 패키지의 클래스를 나열 할 수있는 표준 Java API는 없습니다.
실제로 클래스 패스에서 모든 클래스 및 JAR 파일을 검색하고 정규화 된 클래스 이름 모음을 만들고 원하는대로 검색하여 몇 가지 트릭을 수행 할 수 있습니다. 이 전략은 이전 단락에서 설명한대로 활성 클래스 로더가 작동하지 않는다고 확신하는 경우 제대로 작동합니다. 예를 들어 (Java 의사 코드) :
Map<String, Set<String>> classesInPackage = new HashMap();
for (String entry : eachClasspathEntry()) {
if (isClassFile(entry)) {
String packageName = getPackageName(entry);
if (!classesInPackage.containsKey(packageName)) {
classesInPackage.put(packageName, new HashSet<String>());
}
classesInPackage.get(packageName).add(getClassName(entry));
} else if (isJarOrZipFile(entry)) {
// Do the same for each JAR/ZIP file entry...
}
}
classesInPackage.get("com.foo.bar"); // => Set<String> of each class...
"이 패키지에 클래스 추가"란 무엇입니까? 자바 프로세스의 클래스 패스는 어떻게됩니까? –
@Jeffrey 나는 Reflection에 대해 읽고 있었고 이것이 유일한 방법이라고 생각하지만 Reflection에 대해서는 아무것도 모른다. 그 패키지에있는 각 클래스에 대한 검증을 추가하는 "일반적인 방법"을 시도했지만, 확장 할 수 없기 때문에이 방법을 원하지 않습니다. –
@MiserableVariable 개발 시간에는 패키지에 새로운 클래스를 추가합니다 (모든 클래스는 Document라는 추상 클래스를 확장합니다). –