プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

パッケージ内のクラスを取得する

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で表せないパスの時は動作しないことになるんじゃないかな。


パッケージの機能を増やして欲しいですね。というか、モジュールシステムだとどういう風になるんだろう。