Вы используете какую-либо IDE? Поскольку она будет отображаться автоматически, если вы ее используете.
Джои Рохан
Я использую Eclipse, но мне нужно сделать это с помощью кода.
sticksu
@LuiggiMendoza - у потенциального дубликата есть ответы с примерами, а также ресурсы для документации. Поиск одного из этих имен классов + пример даст несколько полезных результатов.
Aiias
@Alias возможный дубликат указывает, как найти и получить файл из банки, в то время как вопрос заключается в получении имен классов внутри банки (возможно, классов во всех пакетах внутри нее). Ссылка в пунктах ответа ErikKaju к возможному решению с использованием JarInputStreamи JarEntryклассов , которые я не могу найти в любом ответе вашей упомянутой ссылки.
Луиджи Мендоса
Ответы:
68
К сожалению, Java не предоставляет простой способ перечисления классов в «родной» JRE. Это оставляет вам несколько вариантов: (а) для любого заданного файла JAR вы можете перечислить записи внутри этого файла JAR, найти .classфайлы, а затем определить, какой класс Java представляет каждый .classфайл; или (б) вы можете использовать библиотеку, которая сделает это за вас.
Вариант (а): сканирование файлов JAR вручную
В этом варианте мы заполним classNamesсписок всех классов Java, содержащихся в файле jar по адресу /path/to/jar/file.jar.
List<String> classNames =newArrayList<String>();ZipInputStream zip =newZipInputStream(newFileInputStream("/path/to/jar/file.jar"));for(ZipEntry entry = zip.getNextEntry(); entry !=null; entry = zip.getNextEntry()){if(!entry.isDirectory()&& entry.getName().endsWith(".class")){// This ZipEntry represents a class. Now, what class does it represent?String className = entry.getName().replace('/','.');// including ".class"
classNames.add(className.substring(0, className.length()-".class".length()));}}
Вариант (б): Использование специализированных библиотек отражений
гуайява
У Guava было ClassPathпо крайней мере 14.0, что я использовал и любил. Приятно то, ClassPathчто он не загружает найденные классы, что важно, когда вы сканируете большое количество классов.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")){// Do stuff with classes here...}
Размышления
Я лично не использовал библиотеку Reflections , но она мне понравилась. На веб-сайте представлены отличные примеры, например, этот быстрый способ загрузки всех классов в пакет, предоставляемый любым файлом JAR, который также может быть полезен для вашего приложения.
Спасибо. Это отвечает на часть OP «просто получить список классов», о которой не спрашивали.
octopusgrabbus
9
Вы также можете использовать unzip -l jarfile.jarв крайнем случае. Файл JAR - это просто zip-файл с манифестом!
подписано
3
Проблема в том, что он, вероятно, хотел получить файлы классов внутри банки во время выполнения, учитывая экземпляр загрузчика классов (вероятно, чтобы увидеть, какие классы загружены внутри этой конкретной банки).
Ричард Дюрр
19
Возможно, вы ищете jarкоманду для получения списка классов в терминале,
это было именно то, что мне нужно, даже если владельцу вопроса требовалось решение на основе кода. Спасибо!
Provisionncemac
10
Вот что я использую:
Вы можете использовать javaавтозаполнение следующим образом:
java -cp path_to.jar <Tab>
Это даст вам список классов, доступных для передачи в качестве начального класса. Конечно, попытка использовать тот, у которого нет основного файла, ничего не даст, но вы можете увидеть, что javaдумают, что классы внутри класса .jarвызываются.
Добавьте к своему ответу конкретный пример из баночки с образцом.
Juru 08
4
Команда ниже отобразит содержимое файла jar .
команда: - unzip -l jarfilename.jar.
образец о / п: -
Archive: hello-world.jar
Length Date Time Name
--------- ---------- ----- ----
43161 10-18-2017 15:44 hello-world/com/ami/so/search/So.class
20531 10-18-2017 15:44 hello-world/com/ami/so/util/SoUtil.class
--------- -------
63692 2 files
Согласно руководству unzip
-l список файлов архива (короткий формат). Распечатываются имена, размеры несжатых файлов, даты и время изменения указанных файлов, а также итоговые данные для всех указанных файлов. Если UnZip был скомпилирован с определением OS2_EAS, опция -l также перечисляет столбцы для размеров сохраненных расширенных атрибутов OS / 2 (EAs) и списков управления доступом (ACL) OS / 2. Кроме того, отображаются комментарии к zip-файлу и отдельные комментарии к файлу (если есть). Если файл был заархивирован из файловой системы с одним регистром (например, из старой файловой системы MS-DOS FAT) и был задан параметр -L, имя файла преобразуется в нижний регистр и начинается с символа вставки (^).
Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, его можно было бы значительно улучшить, если бы он включал объяснение того, как и почему это решает проблему. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас! Пожалуйста , измените свой ответ , чтобы добавить объяснение, и дать указание о том , что применять ограничения и допущения.
Тоби Спейт
2
Вы можете попробовать это:
unzip -v /your/jar.jar
Это будет полезно, только если ваша банка является исполняемой, то есть в манифесте вы определили какой-то класс как основной класс
JarInputStream
иJarEntry
классов , которые я не могу найти в любом ответе вашей упомянутой ссылки.Ответы:
К сожалению, Java не предоставляет простой способ перечисления классов в «родной» JRE. Это оставляет вам несколько вариантов: (а) для любого заданного файла JAR вы можете перечислить записи внутри этого файла JAR, найти
.class
файлы, а затем определить, какой класс Java представляет каждый.class
файл; или (б) вы можете использовать библиотеку, которая сделает это за вас.Вариант (а): сканирование файлов JAR вручную
В этом варианте мы заполним
classNames
список всех классов Java, содержащихся в файле jar по адресу/path/to/jar/file.jar
.Вариант (б): Использование специализированных библиотек отражений
гуайява
У Guava было
ClassPath
по крайней мере 14.0, что я использовал и любил. Приятно то,ClassPath
что он не загружает найденные классы, что важно, когда вы сканируете большое количество классов.Размышления
Я лично не использовал библиотеку Reflections , но она мне понравилась. На веб-сайте представлены отличные примеры, например, этот быстрый способ загрузки всех классов в пакет, предоставляемый любым файлом JAR, который также может быть полезен для вашего приложения.
источник
Вы можете использовать
jar
инструмент Java . Перечислите содержимое jar-файла в txt-файле, и вы увидите все классы в jar-файле.источник
unzip -l jarfile.jar
в крайнем случае. Файл JAR - это просто zip-файл с манифестом!Возможно, вы ищете
jar
команду для получения списка классов в терминале,где,
Или просто нажмите на результат выше, чтобы увидеть
.class
только esЧтобы увидеть количество
class
es,источник
Вот что я использую:
Вы можете использовать
java
автозаполнение следующим образом:Это даст вам список классов, доступных для передачи в качестве начального класса. Конечно, попытка использовать тот, у которого нет основного файла, ничего не даст, но вы можете увидеть, что
java
думают, что классы внутри класса.jar
вызываются.источник
Вы можете использовать
источник
Можешь попробовать:
Это будет полезно, только если ваша банка является исполняемой, то есть в манифесте вы определили какой-то класс как основной класс
источник
Команда ниже отобразит содержимое файла jar .
команда: -
unzip -l jarfilename.jar
.образец о / п: -
Archive: hello-world.jar Length Date Time Name --------- ---------- ----- ---- 43161 10-18-2017 15:44 hello-world/com/ami/so/search/So.class 20531 10-18-2017 15:44 hello-world/com/ami/so/util/SoUtil.class --------- ------- 63692 2 files
Согласно руководству
unzip
источник
Вы можете попробовать это:
Это будет полезно, только если ваша банка является исполняемой, то есть в манифесте вы определили какой-то класс как основной класс
источник
Используйте этот сценарий bash:
это перечислит классы внутри jar-файлов в вашем каталоге в форме:
Пример вывода:
В Windows вы можете использовать PowerShell:
источник
Описание решения : для этого можно использовать среду Eclipse IDE, создав образец java-проекта и добавив все jar-файлы в путь сборки проекта.
ШАГИ ниже :
Создайте образец проекта Eclipse Java.
Все банки, которые у вас есть в пути сборки
CTRL + SHIFT + T и введите полное имя класса.
Результаты будут отображаться в окне со всеми банками, имеющими этот класс. См. Прикрепленное изображение.
источник
windows cmd: это будет работать, если у вас есть все банки te в одном каталоге и выполните следующую команду
источник
Mac OS: В терминале:
источник