Как распечатать структуры классов в файле jar с помощью инструмента javap?

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

Я ожидаю что-то вроде, если скажу

javap java.lang.*

он должен заручиться методами и членами всех классов в пакете java.lang. Если javap не способен на это, существуют ли такие инструменты?

Ответы

Ответ 1

#!/bin/bash
# Set the JAR name
jar=<JAR NAME>
# Loop through the classes (everything ending in .class)
for class in $(jar -tf $jar | grep '.class'); do 
    # Replace / with .'s
    class=${class//\//.};
    # javap
    javap -classpath $jar ${class//.class/}; 
done

Ответ 2

Еще проще было бы

javap -classpath <JARNAME> $(jar -tf <JARNAME> | grep "class$" | sed s/\.class$//)

Ответ 3

Сначала распакуйте файл jar, это даст ряд каталогов для каждого пакета, а затем применит команду javap для каждого каталога.

Так, например, с помощью tomcat вы можете разархивировать файл catalina-balancer.jar в webapps\balancer, а затем использовать

javap -classpath org\apache\webapp\balancer Rule

который дает

Compiled from "Rule.java"
interface org.apache.webapp.balancer.Rule{
    public abstract boolean matches(javax.servlet.http.HttpServletRequest);
    public abstract java.lang.String getRedirectUrl();
}

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

(Это было бы довольно легко написать в perl/ bash/java).