2012-08-29 3 views
3

별도의 자바 프로젝트에서 모든 패키지 이름을 가져오고 싶습니다. 자바에서 반사를 사용하여 어떻게하면 좋을까요?자바 리플렉션을 사용하여 패키지 이름 가져 오기

프로젝트를 빌드 경로에 가져 왔고 아래 코드를 사용하여 패키지 이름을 가져 오려고했습니다.

Package[] pack = Package.getPackages();

편집 :이 같은 디렉토리에있을 것 같은 나는 jar 파일을 사용하지 않는, 그냥 프로젝트를 가져 왔습니다. 필자가 만든 패키지, 특히 특정 디렉토리로 시작하는 패키지 만 필요합니다.

+0

* "나는 어떻게 바람직하게 반사를 사용하여 Java에서이 작업을 수행 할 것 별도의 자바 프로젝트의 모든 패키지 이름을 싶어?"* 최종 사용자는이 모든 헛소리 무엇을 얻을 수 있습니까? 어떤 ** 응용 프로그램 기능 **을 제공하려고합니까? –

답변

6

getPackages()을 사용하여 라이브러리의 모든 패키지 이름을 알 수는 없으므로 클래스 로더에 알려진 패키지 이름 만 나열됩니다. 즉, 클래스가 아직 특정 패키지에서로드되지 않은 경우 클래스에없는 것입니다.

jip 파일 처리 루틴을 사용하여 jar 파일을 열고 디렉토리 이름별로 패키지를 읽습니다. 이 기술을 사용하면 "사용 중이 아닌"패키지 이름을 포함하여 모든 패키지 이름을 찾을 수 있습니다. 기본적으로 .class 파일이 들어있는 경로는 "패키지 이름"입니다. 자세한 내용으로 편집

는 ----

당신이 JAR 파일을 사용하지 않는 (그리고 왜? 그들은 정말 좋은 방법입니다!) 때문에, 당신이해야합니다 --- JAR 파일을 사용하지 않는 나타냅니다 디렉토리를 스캔합니다. 디렉토리를 "찾으려면"클래스 경로를 잘라야합니다. 클래스 경로를 얻을 수있는 방법은 다음과 같습니다

String classpath = System.getProperty("java.class.path", null); 

그런 다음 당신이 그것을에서 .class 파일이 각 "출발점"아래의 모든 디렉토리의 검색을 수행. 일단 그 모든 것들이 갖추어지면 모든 패키지를 갖게됩니다.

다시 말해, 클래스 로더가 모든 클래스를로드하지 않는다고 보장 할 수 없다면 (예 : 일반적으로 그렇지 않은 경우) 클래스 로더에게 묻는 것만으로는 모든 패키지를 알 수 없습니다. 당신이 빈 패키지를 필요로하지 않는 한

+0

이것은 작동하지 않습니다. 자세한 내용은 편집을 참조하십시오. – Colin747

+0

업데이트를 확인하고 클래스를 jar 파일로 패키지하는 것을 고려하십시오. –

0

,이 같은 작업을해야합니다 :

/** 
* Finds all package names 
* @return Set of package names 
*/ 
public Set<String> findAllPackages() { 
    List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>(); 
    classLoadersList.add(ClasspathHelper.contextClassLoader()); 
    classLoadersList.add(ClasspathHelper.staticClassLoader()); 
    Reflections reflections = new Reflections(new ConfigurationBuilder() 
      .setScanners(new SubTypesScanner(false), new ResourcesScanner()) 
      .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) 
      .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("my.base.package")))); 
    Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class); 
    Set<String> packageNameSet = new TreeSet<String>(); 
    for (Class classInstance : classes) { 
     packageNameSet.add(classInstance.getPackage().getName()); 
    } 
    return packageNameSet; 
} 

그것은, 모든 클래스를 찾아 그들을 통해 루프 및 중복을 피하기 위해 설정에 저장된 패키지 이름을 가져옵니다.

아쉽게도 개체 검색을 허용하기 위해 사용자 지정 구성을 지정하지 않고 아래 Reflections 개체의 코드를 사용할 수 없습니다.

Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class); 
관련 문제