Java Guavaライブラリが提供するClassPathで全クラスを探す

ここでは、GuavaライブラリのClassPathを使って、パッケージに含まれるクラスを探す方法を見ていく。

ロード可能なすべてのクラスを探す

ここでは、Google Guavaライブラリを使用してクラスを探す方法を見ていく。
Google Guavaは、クラスローダーのソースを検索し、ロード可能なすべてのクラスを見つけるClassPathユーティリティクラスを提供している。

次の例は、入力されたパッケージ以下に存在するすべてのクラスを探して表示する。

package com.devkuma.guava.classloader;

import java.io.IOException;
import java.util.Set;
import java.util.stream.Collectors;

import com.google.common.reflect.ClassPath;

public class FindAllClasses {

    public Set<Class> findAllClasses(String packageName) throws IOException {
        return ClassPath.from(ClassLoader.getSystemClassLoader())
                        .getAllClasses()
                        .stream()
                        .filter(clazz -> clazz.getPackageName()
                                              .startsWith(packageName))
                        .map(clazz -> clazz.load())
                        .collect(Collectors.toSet());
    }

    public static void main(String[] args) throws IOException {
        FindAllClasses instance = new FindAllClasses();

        Set<Class> classes = instance.findAllClasses("com.devkuma.guava");
        for (Class clazz : classes) {
            System.out.println(clazz.getCanonicalName());
        }
    }
}

実行結果:

com.devkuma.guava.joiner.JoinerWithKeyValueSeparator
com.devkuma.guava.joiner.JoinerArrayJoin
com.devkuma.guava.strings.StringCommonPrefixCommonSuffix
com.devkuma.guava.joiner.JoinerListJoin

... 以下省略 ...

入力されたパッケージ名にはcom.devkuma.guavaを指定した。