指定パッケージ内のクラス一覧を取得するサンプル
1.6より追加されたStandardJavaFileManagerを使用して、指定パッケージ内のクラス一覧を取得するサンプルです。
import javax.tools.DiagnosticCollector; import javax.tools.JavaCompiler; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.StandardLocation; import javax.tools.ToolProvider; ... JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); JavaFileManager fm = compiler.getStandardFileManager( new DiagnosticCollector<JavaFileObject>(), null, null); // 一覧に含めるオブジェクト種別。以下はクラスのみを含める。 Set<JavaFileObject.Kind> kind = new HashSet<JavaFileObject.Kind>(){{ add(JavaFileObject.Kind.CLASS); }}; // ブートクラスパスから、"java.io"パッケージ以下のクラス一覧を取得する。 for ( JavaFileObject f : fm.list(StandardLocation.PLATFORM_CLASS_PATH, "java.io", kind, false)) { System.out.println( f.getName() ); }
実行時にはjdk付属のtools.jarをクラスパスに追加しておく必要があるのでお忘れなく。実行結果は以下です。
Bits.class BufferedInputStream.class BufferedOutputStream.class BufferedReader.class BufferedWriter.class ByteArrayInputStream.class ByteArrayOutputStream.class CharArrayReader.class CharArrayWriter.class CharConversionException.class Closeable.class ...略
内部的には、「ロードしたクラスを元に探索」ではなく「ファイルシステムベースでクラスパス上のjarを展開して探索」している模様。昔は似たようなことを自前でやっていたけど、最近はさくっとできるんですねー。何かに使えそう。