Сканирование пакетов 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;
}
}