2013-10-25 9 views
8

現在、リフレクションを使用して、classesフィールドのロードされたすべてのクラスをClassLoaderに入力して、getPackageが検索しているパッケージと等しいかどうかを確認しています。私がこれを持っている1つの問題は、クラスがClassLoaderによってロードされていないことです。しかし、私はクラスを動的にロードして常に変更しているので、クラス名を知らないので、自分でロードする方法はありません。Class.forName 。クラスの共通点は、Moduleを拡張することです。パッケージからすべてのクラスをロードするにはどうすればいいですか?パッケージ内のすべてのクラスをロードする

ありがとうございます。

+0

http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflectionこの回答は役に立ちましたか? – iluxa

+0

@iluxaパッケージ内のすべてのクラスを取得できますただし、ロードされた場合のみ –

+1

説明[こちら](http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection/520344#520344) – mithrandir

答えて

0

reflections APIを使用すると、確実に機能します。それが間違った方法で設定するかもしれません。私はこの例を作ったばかりで、クラ​​スローダーから独立してパッケージ内のすべてのクラスを出力します。

package com.test; 

import java.util.Arrays; 
import java.util.Iterator; 
import java.util.Set; 

import org.reflections.Reflections; 
import org.reflections.scanners.FieldAnnotationsScanner; 
import org.reflections.scanners.MemberUsageScanner; 
import org.reflections.scanners.MethodAnnotationsScanner; 
import org.reflections.scanners.MethodParameterNamesScanner; 
import org.reflections.scanners.MethodParameterScanner; 
import org.reflections.scanners.SubTypesScanner; 
import org.reflections.scanners.TypeAnnotationsScanner; 
import org.reflections.util.ClasspathHelper; 
import org.reflections.util.ConfigurationBuilder; 
import org.reflections.util.FilterBuilder; 

public class Runner { 

    public static void main(String[] args) { 
     Reflections reflections = new Reflections(); 
     FilterBuilder TestModelFilter = new FilterBuilder().include("com.test.*"); 

     reflections = new Reflections(new ConfigurationBuilder() 
       .setUrls(Arrays.asList(ClasspathHelper.forClass(Runner.class))).filterInputsBy(TestModelFilter) 
       .setScanners(new SubTypesScanner(false), new TypeAnnotationsScanner(), new FieldAnnotationsScanner(), 
         new MethodAnnotationsScanner(), new MethodParameterScanner(), new MethodParameterNamesScanner(), 
         new MemberUsageScanner())); 

     Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class); 
     System.out.println(allClasses); 
     for (Iterator it = allClasses.iterator(); it.hasNext();) { 
      Class<? extends Object> clazz = (Class<? extends Object>) it.next(); 
      System.out.println(clazz.getCanonicalName()); 
     } 
    } 

} 

すべてのインポートを意図して追加したので、どのAPIを使用しているかを確認できます。これはあなたのために働きますか?

関連する問題