Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

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

#java #рефлексия #package


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


Ответы

Ответ 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> 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> classes = new ArrayList<>(); for (File file : scannedDir.listFiles()) { classes.addAll(find(file, scannedPackage)); } return classes; } private static List> find(File file, String scannedPackage) { List> 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> classes = ClassFinder.find("examples.concurrency");

Ответ 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()); } }

Ответ 3



Могу предложить библиотеку Reflections. С ее помощью можно легко получить информацию о классах для заданного пакета: private static List> 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()); } Зависимость: org.reflections reflections 0.9.10

Комментариев нет:

Отправить комментарий