JavaCompilerからJavaFileManagerを取得するやり方が簡単だ。
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); JavaFileManager fm = compiler.getStandardFileManager( new DiagnosticCollector<JavaFileObject>(), null, null); Set<JavaFileObject.Kind> kind = new HashSet<JavaFileObject.Kind>(); kind.add(JavaFileObject.Kind.CLASS); for(JavaFileObject f:fm.list(StandardLocation.CLASS_PATH, packagename, kind, false)){ String name = f.getName(); String clname = name.substring(0,name.length()-6);//クラス名取得 //処理 }
これを使っていたのだが、実家のPCで実行するとヌルポしてしまった。
なるほど、
getSystemJavaCompiler
public static JavaCompiler getSystemJavaCompiler()
このプラットフォームに付属している Java™ プログラミング言語コンパイラを取得します。
戻り値:
このプラットフォームに付属しているコンパイラ。コンパイラが付属していない場合は null
javacにパスが通ってなければどうやらnullが返るようだ。
自分の環境で動かすだけならいいのだが、これだと何かと問題が起こるかもしれない。
というわけで、こうした。
URI uri = Test.class.getResource("Test.class").toURI(); File test = new File(uri); File dir = test.getParentFile(); File[] fs = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { String name = pathname.getName(); return name.endsWith("class"); } }); for(File f:fs){ String name = f.getName(); String clname = name.substring(0,name.length()-6); //処理 }
しかし、これだとアプレットみたいにFileで表せないパスの時は動作しないことになるんじゃないかな。
パッケージの機能を増やして欲しいですね。というか、モジュールシステムだとどういう風になるんだろう。