Как найти все классы в директории с помощью File.walk

Суть проблемы: нужно найти все классы содержащиеся в выбраном пакете с помощью File.walk


Ответы (1 шт):

Автор решения: Alexandr

Вот небольшой пример:

package com.somepackage;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

    public static void main(String[] args) throws IOException {
        final var path =
                Paths.get(
                        Main.class.getProtectionDomain().getCodeSource().getLocation().getPath(),
                        "/com/somepackage");
        findFiles(path, Collections.singleton("class"))
                .forEach(p -> System.out.println("File: [" + p.getFileName() + "]"));
    }

    public static Optional<String> getExtension(
            String fileName) {
        return Optional.of(fileName.lastIndexOf('.'))
                .filter(i -> i >= 0)
                .map(i -> fileName.substring(i + 1));
    }

    public static List<Path> findFiles(
            Path path,
            Set<String> extensions) throws IOException {
        try (Stream<Path> paths = Files.walk(path)) {
            return paths
                    .filter(Files::isRegularFile)
                    .filter(p ->
                            getExtension(p.getFileName().toString())
                                    .filter(extensions::contains)
                                    .isPresent())
                    .collect(Collectors.toList());
        }
    }

}

Вывод:

File: [Main.class]
→ Ссылка