как получить все классы в пакете javaapplication7?

144
29 декабря 2020, 15:20

Есть пакет javaapplication7, в нем 3 простых класса A,B,C, затрудняюсь получить их.

Answer 1

Вот пример класса, который сканирует пакет, и возвращает список его классов

вpublic class ClassFinder {
private static final char PKG_SEPARATOR = '.';
private static final char DIR_SEPARATOR = '/';
private static final String CLASS_FILE_SUFFIX = ".class";
private static final String BAD_PACKAGE_ERROR = "Unable to get resources from path '%s'. Are you sure the package '%s' exists?";
/**
 * Возвращает список классов в пакете
 */
public static List<Class<?>> find(String scannedPackage) {
    String scannedPath = scannedPackage.replace(PKG_SEPARATOR, DIR_SEPARATOR);
    URL scannedUrl = Thread.currentThread().getContextClassLoader().getResource(scannedPath);
    if (scannedUrl == null) {
        throw new IllegalArgumentException(String.format(BAD_PACKAGE_ERROR, scannedPath, scannedPackage));
    }
    File scannedDir = new File(scannedUrl.getFile());
    List<Class<?>> classes = new ArrayList<>();
    for (File file : scannedDir.listFiles()) {
        classes.addAll(find(file, scannedPackage));
    }
    return classes;
}
private static List<Class<?>> find(File file, String scannedPackage) {
    List<Class<?>> classes = new ArrayList<>();
    String resource = scannedPackage + PKG_SEPARATOR + file.getName();
    if (file.isDirectory()) {
        for (File child : 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;
}

}

Пример вызова

List<Class<?>> classes = ClassFinder.find("examples.concurrency");
Answer 2

Можете воспользоваться библиотекой: Class graph Maven Central

Пример:

try (ScanResult scanResult = new ClassGraph()
        .whitelistPackages("javax.persistence")      // Сканирует пакет javax.persistence и все его подпакеты
        .scan()) {
    for (ClassInfo classInfo : scanResult.getAllClasses()) {
        System.out.println(classInfo.getName());
    }
}
Answer 3

Могу предложить библиотеку Reflections. С ее помощью можно легко получить информацию о классах для заданного пакета:

private static List<Class<?>> getAllClassesFrom(String packageName) {
    return new Reflections(packageName, new SubTypesScanner(false))
            .getAllTypes()
            .stream()
            .map(name -> {
                try {
                    return Class.forName(name);
                } catch (ClassNotFoundException e) {
                    return null;
                }
            })
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
}

Зависимость:

<dependency>
        <groupId>org.reflections</groupId>
        <artifactId>reflections</artifactId>
        <version>0.9.10</version>
</dependency>
READ ALSO
отображение данных в таблице TableView

отображение данных в таблице TableView

Ситуация такаяу меня есть 2 таблицы

112
Передать значение accept в компонент

Передать значение accept в компонент

Необходимо, чтобы при клике на кнопку, окно загрузки файлов открывалось с определенным acceptВ моем примере, accept применяется уже после того,...

135
Нужно создать кнопку в каждом поле таблицы HTML, которые будут взаимодейтсвовать с полями базы данных Postgresql. Делаю на Node JS

Нужно создать кнопку в каждом поле таблицы HTML, которые будут взаимодейтсвовать с полями базы данных Postgresql. Делаю на Node JS

В таблицу HTML выводятся данные из БД PostgresИ рядом с каждым полем должна выводится кнопка "Удалить клиента"

124
Сравнение числа с поля ввода, выводить сообщение на страницу

Сравнение числа с поля ввода, выводить сообщение на страницу

Посмотрите где у меня ошибка в коде, который будет проверять введенное значение, и говорить, сдали вы тест или нет

109