現時点でロードされているすべてのクラスで、特定のパターンに一致するクラスを検索したいと思います。
たとえば、私は次のようなことをしたいと思います:
List<Class<?>> classess = getClassesFromPattern("*.Entity*");
その結果、次のようになります。
com.package.EntityA
com.package.EntityB
com.package.EntityC
どうすればそれを実装できますか?
現時点でロードされているすべてのクラスで、特定のパターンに一致するクラスを検索したいと思います。
たとえば、私は次のようなことをしたいと思います:
List<Class<?>> classess = getClassesFromPattern("*.Entity*");
その結果、次のようになります。
com.package.EntityA
com.package.EntityB
com.package.EntityC
どうすればそれを実装できますか?
List<Class<?>> classes = CPScanner.scanClasses(new PackageNameFilter(
"com.package"), new ClassNameFilter("*Entity*"));
最初に Instrumentation.getInitiatedClasses(ClassLoader) を実行します ( http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getInitiatedClasses(java.lang.ClassLoader)を参照)。 loader が開始ローダーであるすべてのクラスの配列。指定されたローダーが null の場合、ブートストラップ クラス ローダーによって開始されたクラスが返されます。getInitiatedClasses メソッドによって返される結果でパターンを検索します
あなたが望むほど単純ではありません。
Class.forName()
指定した完全修飾クラス名に従って 1 つのクラスを取得します。
クラスパスを分析し、すべてのクラスパス フラグメントを読み取り、クラスをリソースとして読み取り (jar ファイルとプレーン ディレクトリとは異なります)、パターンに従ってクラスを検索できます。
良いニュースは、そのようなライブラリが存在することです。これはReflectionsという名前です。実装されたインターフェイス、注釈、(おそらく) クラス名パターンなど、さまざまな基準でクラスを取得できます。また、拡張可能であり、必要に応じて独自の実装を追加できます。