Как мне прочитать все классы из пакета Java в classpath? - PullRequest
90 голосов
/ 22 сентября 2009

Мне нужно прочитать классы, содержащиеся в пакете Java. Эти классы находятся в classpath. Мне нужно сделать эту задачу непосредственно из программы Java. Знаете ли вы простой способ сделать?

List<Class> classes = readClassesFrom("my.package")

Ответы [ 17 ]

1 голос
/ 14 октября 2015

Вот еще один вариант, небольшая модификация другого ответа выше / ниже:

Reflections reflections = new Reflections("com.example.project.package", 
    new SubTypesScanner(false));
Set<Class<? extends Object>> allClasses = 
    reflections.getSubTypesOf(Object.class);
1 голос
/ 22 сентября 2009

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

Идея состоит в том, чтобы найти местоположение исходного файла класса, который доступен в большинстве случаев (насколько я тестировал, известным исключением являются файлы классов JVM). Если код находится в каталоге, просмотрите все файлы и только файлы спот-классов. Если код находится в файле JAR, отсканируйте все записи.

Этот метод можно использовать только когда:

  1. У вас есть класс, который находится в том же пакете, который вы хотите обнаружить. Этот класс называется SeedClass. Например, если вы хотите перечислить все классы в java.io, начальный класс может быть java.io.File.

  2. Ваши классы находятся в каталоге или в файле JAR, в котором есть информация об исходном файле (не файл исходного кода, а просто исходный файл). Насколько я пытался, он работает почти на 100%, за исключением класса JVM (эти классы поставляются с JVM).

  3. Ваша программа должна иметь разрешение на доступ к ProtectionDomain этих классов. Если ваша программа загружена локально, проблем не должно быть.

Я тестировал программу только для своего регулярного использования, поэтому она все еще может иметь проблемы.

Надеюсь, это поможет.

0 голосов
/ 15 августа 2018

Если вы уже используете Guava, вы можете использовать ClassPath. Проверьте документы здесь: https://google.github.io/guava/releases/17.0/api/docs/com/google/common/reflect/ClassPath.html

0 голосов
/ 27 марта 2014

использовать зависимость maven:

groupId: net.sf.extcos
artifactId: extcos
version: 0.4b

, затем используйте этот код:

ComponentScanner scanner = new ComponentScanner();
        Set classes = scanner.getClasses(new ComponentQuery() {
            @Override
            protected void query() {
                select().from("com.leyton").returning(allExtending(DynamicForm.class));
            }
        });
0 голосов
/ 22 сентября 2009

В те времена, когда апплеты были обычным явлением, на пути к классам мог быть URL. Когда загрузчику классов требуется класс, он выполняет поиск во всех местах на пути к классам, включая ресурсы http. Поскольку вы можете иметь такие вещи, как URL-адреса и каталоги на пути к классам, нет простого способа получить окончательный список классов.

Однако вы можете подойти довольно близко. Некоторые из библиотек Spring делают это сейчас. Вы можете получить все банки на пути к классам и открыть их, как файлы. Затем вы можете взять этот список файлов и создать структуру данных, содержащую ваши классы.

0 голосов
/ 11 января 2012

Проект ldapbeans предоставляет класс Сканер , который делает это.

0 голосов
/ 22 сентября 2009

Brent - причина, по которой ассоциация является одним из способов, связана с тем фактом, что любой класс в любом компоненте вашего CLASSPATH может объявить себя в любом пакете (кроме java / javax). Таким образом, просто нет отображения ВСЕХ классов в данном «пакете», потому что никто не знает и не может знать. Вы можете обновить файл JAR завтра и удалить или добавить классы. Это все равно, что пытаться получить список всех людей по имени Джон / Джон / Йохан во всех странах мира - никто из нас не является всезнающим, поэтому никто из нас никогда не получит правильный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...