2017-03-23 5 views
1

以下のコードを使用して、指定されたパッケージ名内のすべてのクラスを検索しています。コードが自分のプロジェクトに直接配置されている場合、これはうまく動作します。しかし、私がまとめたCommons Jarからサービスを呼び出すことは、自分のプロジェクトからデータを返すことではありません。これは達成できますか?私はorg.reflection.Reflectionsライブラリを使用しています。パッケージ内のすべてのクラスを検索するリフレクションライブラリ

public Set<Class<?>> reflectPackage(String packageName){ 
    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(packageName)))); 

    return reflections.getSubTypesOf(Object.class); 
} 

Project Structure 

Eclipse --- Security Base // Project 
     |  | 
     |  --- reflectPackage("com.app.controller") call 
     |   // Note: this package is within this project, not the Commons project. 
     | 
     --- Commons // Project 
      | 
      --- Reflector // Class 
       | 
       --- reflectPackage // Method 

答えて

2

私は、私たちのプロジェクトの一つでFast Classpath Scannerを使用し、それが本当に有用であることが分かってきました。クラスパスのスキャンには、多くの便利な機能があります。パッケージ内のクラスに関する情報を提供する例を以下に示します。サードパーティのjarファイルの一部であっても、パッケージ/クラスをスキャンして見つけます。

public Set<Class<?>> reflectPackage(String packageName) { 
    final Set<Class<?>> classes = new HashSet<>(); 
    new FastClasspathScanner("your.package.name") 
     .matchAllClasses(new ClassMatchProcessor() { 

     @Override 
     public void processMatch(Class<?> klass) { 
      classes.add(klass); 
     } 
    }).scan(); 
    return classes; 
} 
+0

ありがとうございます!これは私のためにはうまくいっていて、以前のソリューションよりもはるかに少ないコードです。 – jDub9

関連する問題