2009-07-23 5 views
14

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

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

javap java.lang.* 

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

ответ

22
#!/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 /'s with .'s 
    class=${class//\//.}; 
    # javap 
    javap -classpath $jar ${class//.class/}; 
done 
+6

javap будет радостно disasseble имена классов с '/' вместо '.', Вам нужно только удалить суффикс '.class'. Я использую 'zipinfo -1 $ {jar} \ *. Class | sed 's/\. class //' | xargs javap -classpath «$ jar» -c -l -private> $ {jar} .javap' –

2

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

Так, например, с котом вы можете распаковать Catalina-balancer.jar файл в WebApps \ балансира, а затем использовать

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(); 
}

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

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

+0

Конечно - я люблю имеющие дополнительный материал прокладки вокруг моей системы. Это работает, но не очень. – javadba

9

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

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

preend JARNAME =/path/to/jar <остальная часть команды> и который сохраняет всю операцию в одной строке – javadba