/**
* ディレクトリに存在する、特定パッケージのClassオブジェクトを、サブパッケージ含め、再帰的に取得
*/
public static List<Class<?>> getClasses(File dir, String dotSeparatedPackage) throws ClassNotFoundException {
List<Class<?>> classes = new LinkedList<Class<?>>();
dotSeparatedPackage =
(dotSeparatedPackage.endsWith(".")) ? dotSeparatedPackage : dotSeparatedPackage + ".";
String slashSeparatedPackage = dotSeparatedPackage.replaceAll("\\.", "/");
for (File resource : dir.listFiles()) {
if (resource.isDirectory()) {
List<Class<?>> subDirClasses = getClasses(resource, dotSeparatedPackage);
classes.addAll(subDirClasses);
} else {
if (isClassFile(resource)) {
Class<?> clazz = getClass(resource, slashSeparatedPackage);
if (clazz != null) {
classes.add(clazz);
}
}
}
}
return new ArrayList<Class<?>>(classes);
}
private static boolean isClassFile(File resource) {
return (resource.isFile()) &&
resource.getName().endsWith(".class") ? true : false;
}
private static Class<?> getClass(File file, String slashSeparatedPackage) throws ClassNotFoundException {
String fqcn = changeFqcn(file, slashSeparatedPackage);
if (fqcn != null) {
return Class.forName(fqcn);
} else {
return null;
}
}
/*
* Fileが指定パッケージのクラスだったらFQCNに変換
*/
private static String changeFqcn(File classFile, String slashSeparatedPackage) {
String uri = classFile.toURI().toString();
int beginIndex = uri.indexOf(slashSeparatedPackage);
int endIndex = uri.lastIndexOf(".class");
if (beginIndex < 0 || endIndex < 0) {
return null;
} else {
String uriSubString = uri.substring(beginIndex, endIndex);
String fqcn = uriSubString.replaceAll("/", ".");
return fqcn;
}
}
More than 5 years have passed since last update.
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
List of users who liked
22