Как получить дочерние классы с префиксными пакетами, используя загрузку классов отражения из папки развертывания в Java? - PullRequest
0 голосов
/ 17 января 2020

Попробовал ниже код, но он дает нулевые результаты (subTypesOf size равен нулю).

 File projectFolder = new File("project_folder_some_path");
 final Set<URL> urls = new HashSet<>();
        Files.walkFileTree(projectFolder.toPath(), new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                if (file.toString().endsWith(".class")) {
                    urls.add(file.toFile().toURI().toURL());
                }
                return super.visitFile(file, attrs);
            }
        });

        URLClassLoader classLoader = new URLClassLoader(urls.toArray(new URL[0]), getClass().getClassLoader());
        ConfigurationBuilder configuration = new ConfigurationBuilder()
                .addClassLoader(classLoader)
                .addUrls(urls)
                .setScanners(new SubTypesScanner(false), new TypeAnnotationsScanner())
                .filterInputsBy(new FilterBuilder().includePackage("com.comp"));
        Reflections reflections = new Reflections(configuration);
        Set<Class<?>> subTypesOf = (Set<Class<?>>) reflections.getSubTypesOf(classLoader.loadClass("com.comp.framework.bean.SuperNumeratorIdEntity"));
// subTypesOf  size is zero
        classLoader.close();

здесь subTypesOf size равен нулю. Но файлы классов присутствуют в папке проекта, которая расширяет com.comp.framework.bean.SuperNumeratorIdEntity

Класс, который я ищу, выглядит следующим образом: publi c Класс XyzEntity расширяет SuperNumeratorIdEntity

1 Ответ

0 голосов
/ 17 января 2020

Находятся ли классы в типичной иерархии папок? тогда ваш URL должен ссылаться на эту папку, а не на каждый файл .class в ней. И заканчиваем /, чтобы дать java информацию о том, что здесь должна быть папка:

URLClassLoader classLoader = new URLClassLoader(new URL[]{new URL("file:///c:/projects/myProject/bin/")}, getClass().getClassLoader());
...