Мне нужно прочитать классы, содержащиеся в пакете Java. Эти классы находятся в пути к классам. Мне нужно выполнить эту задачу напрямую из программы Java. Вы знаете простой способ сделать?
List<Class> classes = readClassesFrom("my.package")
java
reflection
Йорген Р
источник
источник
Ответы:
Если у вас есть Spring в пути к классам, то это сделает следующее.
Найдите все классы в пакете, помеченные XmlRootElement:
источник
Вы можете использовать проект Reflections, описанный здесь
Он довольно полный и простой в использовании.
Краткое описание с указанного выше сайта:
Пример:
источник
Я использую этот, он работает с файлами или jar-архивами
источник
Spring реализовал отличную функцию поиска пути к классам в
PathMatchingResourcePatternResolver
. Если вы используетеclasspath*
префикс:, вы можете найти все ресурсы, включая классы в данной иерархии, и даже отфильтровать их, если хотите. Затем вы можете использовать ребенокAbstractTypeHierarchyTraversingFilter
,AnnotationTypeFilter
иAssignableTypeFilter
фильтровать эти ресурсы либо на аннотациях на уровне класса или интерфейс они реализуют.источник
Java 1.6.0_24:
Это решение было протестировано в среде EJB .
источник
Scannotation и Reflections используют подход сканирования пути к классам:
Другой подход - использовать Java Pluggable Annotation Processing API для написания процессора аннотаций, который будет собирать все аннотированные классы во время компиляции и создавать индексный файл для использования во время выполнения. Этот механизм реализован в библиотеке ClassIndex :
источник
Насколько мне известно, эта функциональность все еще подозрительно отсутствует в API отражения Java. Вы можете получить объект пакета, просто сделав следующее:
Но, как вы, наверное, заметили, это не позволит вам перечислить классы в этом пакете. На данный момент вы должны использовать подход, более ориентированный на файловую систему.
Я нашел несколько примеров реализации в этом посте
Я не уверен на 100%, что эти методы будут работать, когда ваши классы похоронены в файлах JAR, но я надеюсь, что один из них сделает это за вас.
Я согласен с @skaffman ... если у вас есть другой способ сделать это, я бы рекомендовал сделать это вместо этого.
источник
Наиболее надежным механизмом для перечисления всех классов в данном пакете в настоящее время является ClassGraph , поскольку он обрабатывает максимально широкий спектр механизмов спецификации пути к классам , включая новую модульную систему JPMS. (Я автор.)
источник
eXtcos выглядит многообещающе. Представьте, что вы хотите найти все классы, которые:
С eXtcos это так же просто, как
источник
Билл Берк написал (красивую статью о сканировании классов), а затем написал Scannotation .
В Hibernate уже написано:
CDI может решить эту проблему, но не знаю - еще не исследовал полностью
.
Также для аннотаций:
источник
Я реализовал его, и в большинстве случаев он работает. Так как он длинный, я положил его сюда в файл .
Идея состоит в том, чтобы найти местоположение исходного файла класса, который доступен в большинстве случаев (известным исключением являются файлы классов JVM - насколько я тестировал). Если код находится в каталоге, просканируйте все файлы и найдите только файлы классов. Если код находится в файле JAR, просканируйте все записи.
Этот метод можно использовать только когда:
У вас есть класс, который находится в том же пакете, который вы хотите обнаружить. Этот класс называется SeedClass. Например, если вы хотите перечислить все классы в 'java.io', начальный класс может быть
java.io.File
.Ваши классы находятся в каталоге или в файле JAR, в котором есть информация об исходном файле (не файл исходного кода, а только исходный файл). Насколько я пробовал, он работает почти на 100%, за исключением класса JVM (эти классы поставляются с JVM).
Ваша программа должна иметь разрешение на доступ к ProtectionDomain этих классов. Если ваша программа загружается локально, проблем быть не должно.
Я тестировал программу только для регулярного использования, поэтому проблема все еще может быть.
Надеюсь, это поможет.
источник
Вот еще один вариант, небольшая модификация другого ответа выше / ниже:
источник
Когда-то апплеты были обычным явлением, в пути к классам мог быть URL-адрес. Когда загрузчику классов требовался класс, он выполнял поиск во всех местах пути к классам, включая ресурсы http. Поскольку в пути к классам могут быть такие вещи, как URL-адреса и каталоги, нет простого способа получить окончательный список классов.
Однако можно подойти довольно близко. Некоторые библиотеки Spring делают это сейчас. Вы можете получить все файлы jar в пути к классам и открывать их как файлы. Затем вы можете взять этот список файлов и создать структуру данных, содержащую ваши классы.
источник
использовать maven зависимости:
затем используйте этот код:
источник
Brent - причина, по которой ассоциация является одним из способов, связана с тем фактом, что любой класс любого компонента вашего CLASSPATH может объявить себя в любом пакете (кроме java / javax). Таким образом, просто нет отображения ВСЕХ классов в данном «пакете», потому что никто не знает и не может знать. Вы можете обновить файл jar завтра и удалить или добавить классы. Это все равно, что пытаться получить список всех людей по имени Джон / Джон / Йохан во всех странах мира - никто из нас не всеведущ, поэтому ни у кого из нас никогда не будет правильного ответа.
источник