Использование специализированного инструмента - это, вероятно, способ сделать это надежно.
Однако один действительно Janky способ сделать это было бы, чтобы захватить список всех .class
файлов в вашем JAR, положить JAR на пути к классам и использовать javap
, чтобы получить ссылки на другие классы:
#!/usr/bin/env bash
javap -cp $1 -v \
`zipinfo -1 $1 '*.class' | sed 's:/:.:g' | sed 's:\.class$::'` | \
grep ' = Class' | sed 's:.*// ::' | sort | uniq
Запуск этого на guava-19.0.jar
дает this:
"[[B"
"[B"
"[[C"
"[C"
com/google/common/annotations/Beta
com/google/common/annotations/GwtCompatible
com/google/common/annotations/GwtIncompatible
com/google/common/annotations/VisibleForTesting
com/google/common/base/Absent
com/google/common/base/AbstractIterator
...............................................................
"[Lcom/google/common/util/concurrent/MoreExecutors$DirectExecutor;"
"[Lcom/google/common/util/concurrent/Service$State;"
"[Lcom/google/thirdparty/publicsuffix/PublicSuffixType;"
"[Ljava/io/File;"
"[[Ljava/lang/annotation/Annotation;"
"[Ljava/lang/annotation/Annotation;"
"[Ljava/lang/Class;"
"[Ljava/lang/Comparable;"
"[Ljava/lang/Enum;"
"[[Ljava/lang/Object;"
"[Ljava/lang/Object;"
"[Ljava/lang/reflect/Field;"
"[Ljava/lang/reflect/Method;"
"[Ljava/lang/reflect/Type;"
"[Ljava/lang/reflect/TypeVariable;"
"[Ljava/lang/StackTraceElement;"
"[Ljava/lang/String;"
"[Ljava/net/URL;"
"[Ljava/util/Iterator;"
"[Ljava/util/Map$Entry;"
"[[S"
"[S"
sun/misc/Unsafe
"[[Z"
"[Z"
Вам нужно больше выходного форматирование, и, как уже отмечалось, это не подберут любое использование отражения.
Как это работает:
zipinfo -1 $1 '*.class'
напечатает имена всех файлов в .class
$1
, что аргумент сценария показан. sed
s смените /
s на .
s и удалите расширение .class
, чтобы вы получили список имен классов в стиле Java. Вы могли бы сделать это более элегантно, но это должно сработать.
Задание javap
ставит банку на путь класса -cp
и передает все классы. -v
выводит много информации, включая некоторые записи, которые представляют ссылки на имена классов. grep
гарантирует, что мы только смотрим на них, sed
удаляет дополнительную информацию, которая нам не интересна. sort | uniq
гарантирует, что мы не будем печатать имя какого-либо класса более одного раза. Для стандартизации формата вывода требуется немного больше sed
.
Для «используемых» этой баночкой вы подразумеваете «содержащиеся» этой банкой? –
Я думаю, что он только те, которые на самом деле используются где-то в исходном коде (отсюда его анализ идеи импорта) –
@DavideLorenzoMARINO Нет. Я знаю, что легко узнать, какие классы содержатся в банке. Я хочу знать, какие классы используются, то есть импортировать или вызывать через квалифицированное имя. –