Как я читаю все классы из пакета Java в пути к классу?

Повышение является набором библиотек C++. 10 из которых включаются в tr1 C++ 0x.

Вы можете начинать с повышением здесь .

92
задан Jørgen R 19 December 2014 в 22:49
поделиться

4 ответа

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

-2
ответ дан 24 November 2019 в 06:33
поделиться

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

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

0
ответ дан 24 November 2019 в 06:33
поделиться

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

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

Этот метод можно использовать только в следующих случаях:

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

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

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

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

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

1
ответ дан 24 November 2019 в 06:33
поделиться

Насколько мне известно, эта функция все еще подозрительно отсутствует в API отражения Java. Вы можете получить объект пакета, просто сделав следующее:

Package packageObj = Package.getPackage("my.package");

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

Я нашел несколько примеров реализации в этом сообщении

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

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

3
ответ дан 24 November 2019 в 06:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: