Сканирование пакетов java

У меня есть следующий класс:

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

//interface ClassFinder - просто кастомный интерфейс с одним методом
public class SimpleClassFinder implements ClassFinder {

    private final char PKG_SEPARATOR = '.';

    @Override
    public List<Class<?>> scanClasses(String scannedPackage) {

        char DIR_SEPARATOR = '/';

        String scannedPath = scannedPackage.replace(PKG_SEPARATOR, DIR_SEPARATOR);

        URL scannedUrl = Thread.currentThread().getContextClassLoader().getResource(scannedPath);

        if (scannedUrl == null) {
            String BAD_PACKAGE_ERROR = "Unable to get resources from path '%s'. Are you sure the package '%s' exists?";
            throw new IllegalArgumentException(String.format(BAD_PACKAGE_ERROR, scannedPath, scannedPackage));
        }

        File scannedDir = new File(scannedUrl.getFile());
        List<Class<?>> classes = new ArrayList<>();

        for (File file : Objects.requireNonNull(scannedDir.listFiles())) {
            classes.addAll(find(file, scannedPackage));
        }

        return classes;
    }


    private List<Class<?>> find(File file, String scannedPackage) {

        List<Class<?>> classes = new ArrayList<>();

        String resource = scannedPackage + PKG_SEPARATOR + file.getName();

        String CLASS_FILE_SUFFIX = ".class";

        if (file.isDirectory()) {
            for (File child : Objects.requireNonNull(file.listFiles())) {
                classes.addAll(find(child, resource));
            }

        } else if (resource.endsWith(CLASS_FILE_SUFFIX)) {
            int endIndex = resource.length() - CLASS_FILE_SUFFIX.length();
            String className = resource.substring(0, endIndex);

            try {
                classes.add(Class.forName(className));
            } catch (ClassNotFoundException ignore) {
            }

        }

        return classes;
    }
}

Он сканирует пакет и собирает оттуда все классы

Мне необходимо переписать это с использованием Files.walk. Помогите пж( Честно признаться, этот код я скопипастила, но очень хотела бы разобраться


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

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

Долго вы. Я уже сама)

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class FilesWalkClassFinder implements ClassFinder {

    @Override
    public List<Class<?>> scanClasses(String path) {

        URL url = Thread.currentThread().getContextClassLoader()
                .getResource(path.replaceAll("\\.", "/"));

        if (url == null) {
            String BAD_PACKAGE_ERROR = "Unable to get resources from path '%s'. Are you sure the package '%s' exists?";
            throw new IllegalArgumentException(String.format(BAD_PACKAGE_ERROR, path.replace('.', '/'), path));
        }

        List<Class<?>> classes = new ArrayList<>();

        try (Stream<Path> pathStream = Files.walk(Paths.get(url.toURI()))) {

            List<String> classNames = pathStream
                    .filter(p -> p.toString().endsWith(".class"))
                    .map(Path::toFile)
                    .map(File::getName)
                    .map(f -> path.concat(".").concat(f.replace(".class", "")))
                    .collect(Collectors.toList());

            for (String className : classNames) {
                classes.add(Class.forName(className));
            }

        } catch (URISyntaxException | IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return classes;
    }
}
→ Ссылка