#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
Комментариев нет:
Отправить комментарий