特定のクラスを継承したクラス一覧を出力する方法

掲題の通り、EclipseとかNetBeansの力を借りずにコードを書いてリストを出してみました。

guavaのClassPath使えばこんな感じで簡単に出せるようです。

package tester;

import com.google.common.reflect.ClassPath;

import java.io.IOException;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.apache.struts.action.Action;

/**
 *
 * @author yushi.koga
 */
public class Main {

    public static void main(String... args) {
        try {
            ClassLoader loader = Thread.currentThread().getContextClassLoader();
            Set<Class<?>> allClasses = ClassPath.from(loader)
                    .getTopLevelClassesRecursive("my.package").stream()
                    .map(info -> info.load())
                    .collect(Collectors.toSet());
            allClasses.stream().filter((actionClass) -> (Action.class.isAssignableFrom(actionClass))).forEach((actionClass) -> {
                System.out.println(actionClass.toString());
            });

        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}